reklama

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žka pole Jak používat Java ArrayListArraylist Java je pole s univerzální velikostí. 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. Přečtěte si více 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 se výjimka měla řešit mimo místo, kde je vygenerována, aby bylo možné vyřešit základní příčinu.

Typy výjimek

Následující obrázek ukazuje hlavní části hierarchie výjimek Java. Základní třída je Hodit 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.

Hierarchie výjimek

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. Nekontrolovaná výjimka může být naproti tomu 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

Nekontrolovaná 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.

soukromý neplatný 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 {... hodit nový 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) {hodit novou 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ámeček 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í sledu hovorů to způsobilo chybu 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ž se stav dá lépe zvládnout jinde. Zvažte následující příklady zpracování výjimek Java. Přečtěte si více .

Toto je typické trasování zásobníku, získané z objektu výjimky, když byl zachycen.

Výjimka v podprocesu "main" java.lang. IndexOutOfBoundsException: Index: 8, Size: 5 at java.util. ArrayList.rangeCheck (ArrayList.java: 653) na java.util. ArrayList.get (ArrayList.java: 429) na sample.sample1.main (sample1.java: 24)

Výjimkou je zde IndexOutOfBoundsException. Obsahuje další informace o chybě. Trasování 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 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 zpracovávejte 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 případně 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á, protokolovat výjimku a znovu ji použít?

Snaž se {... } úlovek (java.io. IOException ex) {log.warning (ex.getMessage ()); hodit ex; }

Výjimka třída poskytuje printStackTrace () metoda, která dokáže vytisknout trasování zásobníku na vlastní pěst PrintStream (nebo PrintWriter).

Snaž se {... } úlovek (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. } úlovek (java.io. IOException ex) {// Specifické zpracování zde IOException. } catch (java.sql. SQLException ex) {// SQLException specifické zpracování zde. }

Chcete-li zachytit více typů výjimek, ale použít stejný kód zpracování, můžete prohlásit a chytit blok s více typy následovně:

zkuste {// vyvolá zde některé výjimky. } úlovek (java.io. IOException | java.sql. SQLException ex) {// Zde se pracuje s konkrétním zpracováním IOException a SQLException. } catch (SAXException ex) {// SAXException specifické zpracování zde. }

Č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 zdrojů, například otevřené soubory Vše, co potřebujete vědět o formátech souborů a jejich vlastnostechPoužíváme soubor slov zaměnitelně: hudbu, obrázek, tabulku, prezentaci atd. Ale co vlastně dělá ze souboru „soubor“? Zkusme pochopit tuto základní část práce s počítačem. Přečtěte si více , 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čisticí kód 10 nejhorších chyb programování v historiiVe 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. Přečtěte si více .

InputStream in = null; Snaž se {... in = new FileInputStream (filename);... } úlovek (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 (..); Připojení 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 je přistupováno, 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žití výjimek zvýšit kvalitu kódu Rychlejší zápis nebo kód v textovém editoru Linux s vlastními motivyVáš textový editor Linux 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? Přečtěte si více 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 sekci komentářů níže.

Image Credit: Dmitry Nikolaev prostřednictvím Shutterstock.com