
William Charles
0
2285
6
Výjimka v programování označuje výjimečnou podmínku v určitém okamžiku provádění programu. Používá se, když lze výjimečnou podmínku lépe řešit jinde, než kde se s ní setkáváme. Zvažte následující příklady:
- Pokud se neotevře konfigurační soubor, lze v kódu lépe pracovat, možná pomocí alternativního umístění konfiguračního souboru.
- Přístup k položce pole Jak používat Java ArrayList Jak používat Java ArrayList Java arraylist je univerzální velikost s možností změny velikosti. Poskytuje většinu zařízení obecně očekávaných od polí v jiných jazycích. V tomto článku se naučíte nastavit a používat arraylist. mimo hranice pole označuje chybu programu. Šťastné ladění!
- Chyba analýzy XML by měla být upozorněna na uživatele, aby mohl být soubor XML opraven.
- Program nedostatek paměti (možná při zpracování velkého souboru) může být napraven snad zvýšením množství paměti dostupné pro proces java.
Ve všech těchto případech (a více) by měla být výjimka řešena mimo místo, kde je vygenerována, aby bylo možné vyřešit základní příčinu.
Typy výjimek
Obrázek níže ukazuje hlavní části hierarchie výjimek Java. Základní třída je Házet do které je zařazen Výjimka a Chyba. Třída Výjimka je pro podmínky související s programem, které aplikace mohou zachytit ve snaze zachránit situaci. Třída Chyba, na druhé straně slouží k označení závažných chyb v běhovém prostředí Java, které by aplikace neměly zachytit. Některé příklady jsou: OutOfMemoryError a StackOverflowError.
An Výjimka opět je dvou typů: zaškrtnuto a nezaškrtnuto. Ověřená výjimka musí být zpracována volajícím kódem. Toto pravidlo je vynuceno kompilátorem java. Naopak nezaškrtnutá výjimka může být rozšířena v telefonním řetězci, aniž by to musela být výslovně prohlášena. Následující příklady objasní.
Kontrolované výjimky
Následující metoda se pokusí vytvořit FileReader ze souboru. Konstruktor vyvolá zaškrtnutou výjimku FileNotFoundException které musí být zpracovány volajícím kódem nebo prohlášeny za vyhozené.
Následující kód bude ne kompilace, protože to také ne.
private void loadFile (String filename) FileReader in = new FileReader (filename);
Jedním ze způsobů, jak získat kód ke kompilaci, je zpracovat výjimku (viz níže)..
private void loadFile (String filename) try FileReader in = new FileReader (filename)); catch (FileNotFoundException ex) // výjimka popisovače
Pokud výjimku nelze zpracovat přímo volajícím, musí být deklarována v podpisu metody.
private void loadFile (String filename) vyvolá java.io.FileNotFoundException FileReader in = new FileReader (filename));
Nekontrolované výjimky
Nezaškrtnutá výjimka je výjimka, ze které je podtřída RuntimeException a nemusí se s nimi nakládat přímo ani deklarovat výše. Například následující kód má za následek a NullPointerException, což je typ RuntimeException. Od té doby se však kód kompiluje bez chyby NullPointerException je nekontrolovaná výjimka.
private void handleEvent () String name = null; if (name.length ()> 0)
Výjimky zalamování
Vzhledem k výše uvedené diskusi o kontrolovaných a nekontrolovaných výjimkách se zdá, že je jednodušší se vypořádat s nekontrolovanými výjimkami, protože je nemusíte deklarovat, ani s nimi zacházet sami. S ohledem na toto pohodlí může být někdy užitečné zaškrtnout výjimku do nezaškrtnuté výjimky.
Následující příklad kódu ukazuje, jak zalomit výjimku. Metoda metoda_1 () vyvolá SQLException v jeho těle. Aby se kód správně kompiloval, musí být výjimka prohlášena za vyvolanou.
private void method_1 () vyvolá SQLException … vyvolá novou SQLException;
Když je tato metoda vyvolána z jiné metody (metoda_2 ()), může tato metoda zachytit SQLException a zabalte jej do nezaškrtnuté výjimky, takže nemusí deklarovat výjimku v podpisu metody.
private void method_2 () try method_1 (); catch (java.sql.SQLException ex) throw new RuntimeException (ex);
Výjimka zásobníku trasování
Stopa výjimek zásobníku odkazuje na pole aktivních rámců zásobníku, z nichž každý představuje vyvolání metody, zachycené JVM v okamžiku vyvolání výjimky. Každý rámec zásobníku obsahuje umístění vyvolání metody včetně názvu třídy, názvu metody a případně názvu zdrojového souboru java a čísla řádku v souboru. Je to užitečné pro zpětné sledování posloupnosti hovorů, které způsobily chybu Java Výjimky: Zvládnete je v pořádku? Výjimky v jazyce Java: Zvládnete je správně? Výjimka v programování znamená výjimečnou podmínku při provádění programu. Používá se, když lze podmínku lépe zvládnout jinde. Zvažte následující příklady zpracování výjimek Java. .
Toto je typické trasování zásobníku, získané z objektu výjimky, když byl zachycen.
Výjimka ve vlákně „main“ java.lang.IndexOutOfBoundsException: Index: 8, Size: 5 at java.util.ArrayList.rangeCheck (ArrayList.java:653) at java.util.ArrayList.get (ArrayList.java:429) at sample.sample1.main (sample1.java:24)
Výjimkou je zde výjimka IndexOutOfBoundsException. Obsahuje další informace o chybě. Trasa zásobníku obsahuje 3 rámečky zásobníku, z nichž každý obsahuje informace o poloze, jak je znázorněno.
Zpracování výjimek
Výjimku lze řešit tak, že ji chytíte do a Zkus chytit blokování a provedení nezbytných nápravných opatření. Výjimka Objekt poskytuje několik metod pro extrahování informací o stavu, který je způsobil.
Následující kód zaznamená chybovou zprávu do souboru protokolu.
private void loadConfig () try // vyvolat kód, který by mohl generovat úlovek IOException (java.io.IOException ex) // zde zpracovat výjimku. Může být protokolován do souboru protokolu. log.warning (ex.getMessage ());
Když je výjimka zalomena uvnitř jiného, můžete získat zalomenou výjimku:
Házená příčina = ex.getCause (); log.warning ("Základní příčina:" + příčina.getMessage ());
Potřebujete získat přístup ke trasování zásobníku a možná extrahovat název metody, která jej způsobila?
StringBuilder sbuf = new StringBuilder ("Stack Trace:"); pro (StackTraceElement el: ex.getStackTrace ()) sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); log.warning (sbuf.toString ());
Nebo možná, zapište výjimku a znovu ji spusťte?
zkuste … catch (java.io.IOException ex) log.warning (ex.getMessage ()); hodit ex;
Výjimka třída poskytuje printStackTrace () metoda, která může vytisknout trasování zásobníku na vlastní pěst PrintStream (nebo PrintWriter).
zkuste … chytit (java.io.IOException ex) PrintStream out =…; out.println (ex.getMessage ()); ex.printStackTrace (out);
Můžete zachytit více typů výjimek najednou Snaž se blokovat a provádět zvláštní manipulaci pro každý typ výjimky.
zkuste // vyvolá zde některé výjimky catch (java.io.IOException ex) // IOException specific handling here catch (java.sql.SQLException ex) // SQLException specific handling here
Chcete-li zachytit více typů výjimek, ale použít stejný manipulační kód, můžete prohlásit a úlovek blok s více typy následovně:
zkuste // vyvolá zde některé výjimky catch (java.io.IOException | java.sql.SQLException ex) // Zde se pracuje s konkrétním zpracováním IOException a SQLException catch (SAXException ex) // SAXException specific handling here
Čištění zdrojů konečně
Při práci s kódem, který může vyvolávat výjimky, je nezbytné provést řádné vyčištění všech prostředků, jako jsou otevřené soubory Vše, co potřebujete vědět o souborových formátech a jejich vlastnostech Vše, co potřebujete vědět o souborových formátech a jejich vlastnostech Používáme slovo soubor zaměnitelně: hudba, obrázek, tabulka, prezentace atd. Ale co vlastně dělá ze souboru „soubor“? Zkusme pochopit tuto základní část práce na počítači. , připojení k databázi atd. Vyčištění prostředků by mělo být provedeno v a Konečně blok. Tímto způsobem vyvolá normální i výjimečný výstup z bloku vyčišťovací kód. 10 nejhorších chyb programování v historii 10 nejhorších chyb programování v historii Ve své bouřlivé minulosti také kódovalo způsobené ničení. Případy špatného kódu způsobily katastrofu na velké úrovni. Následuje 10 nejhorších chyb programování v historii. .
InputStream in = null; zkuste … in = new FileInputStream (filename);… catch (java.io.IOException ex) log.warning (ex.getMessage ()); konečně // kód je zde spuštěn při opuštění bloku try // // normálně nebo kvůli výjimce if (in! = null) in.close ();
Try-With-Resources Block
Java 1.7 představil vyzkoušejte zdroje konstrukce, která usnadňuje čištění zdrojů. Vypadá to takto:
try (InputStream in = new FileInputStream (…)) // kód, který používá InputStream.
Když kód opustí blok (ať už čistě nebo kvůli výjimce), InputStream proměnná je automaticky vyčištěna.
Vyčištění více zdrojů deklarováním všech z nich v hlavě bloku.
try (InputStream in = new FileInputStream (…); Connection con =…;) // kód, který používá InputStream a připojení.
Jakýkoli objekt, jehož třída implementuje AutoCloseable rozhraní lze tímto způsobem vyčistit. Následující třída provádí některé specifické vyčištění v zavřít() metoda.
veřejná třída MyClass implementuje AutoCloseable public void close () // cleanup code here
Použijte instanci této třídy v vyzkoušejte zdroje blok.
try (MyClass obj = new MyClass (…)) // kód, který používá objekt MyClass.
Některé běžně zjištěné výjimky
Podívejme se nyní na některé běžně se vyskytující výjimky.
- IndexOutOfBoundsException (nezaškrtnuto): označuje, že index prvku, ke kterému se přistupuje, je mimo hranice pole, řetězce atd.
- SQLException (zaškrtnuto): vyvoláno kvůli chybě databáze.
- IOException (zaškrtnuto): chyba přístupu k souboru nebo chyby související se vstupem a výstupem.
- Přerušená výjimka (zaškrtnuto): vyvoláno při přerušení provádění podprocesu.
- SAXVýjimka (zaškrtnuto): vyvoláno kvůli chybám analýzy XML.
- NullPointerException (nezaškrtnuto): použití null, pokud je vyžadován objekt.
Zabalení
Výjimky jsou primární metodou hlášení chyb a správy chyb v Javě. Správné používání výjimek zvyšuje kvalitu kódu Zápis nebo rychlejší kód v textovém editoru Linux s vlastními motivy Zápis nebo rychlejší kód v textovém editoru Linux s vlastními motivy Váš textový editor v Linuxu nemusí vypadat fádně a „funkční“. Proč jej vylepšit, aby se zvýšila vaše produktivita, ať už skriptování a kódování nebo použití nástroje jako editoru značek? a pomoc při řešení problémů ve výrobě.
Máte nějaké válečné příběhy související s výjimkami? Pokud ano, řekněte nám o tom v níže uvedené sekci komentáře.
Image Credit: Dmitry Nikolaev prostřednictvím Shutterstock.com