logo

Výnimky v Jave

Spracovanie výnimiek v jazyku Java je jedným z účinných prostriedkov na spracovanie chýb pri behu, aby sa zachoval pravidelný tok aplikácie. Java Exception Handling je mechanizmus na spracovanie runtime chýb, ako sú ClassNotFoundException, IOException, SQLException, RemoteException atď.

Čo sú výnimky Java?

V jazyku Java, výnimka je nechcená alebo neočakávaná udalosť, ktorá nastane počas vykonávania programu, t. j. v čase behu, ktorá naruší normálny tok inštrukcií programu. Výnimky môže program zachytiť a spracovať. Keď sa v rámci metódy vyskytne výnimka, vytvorí sa objekt. Tento objekt sa nazýva objekt výnimky. Obsahuje informácie o výnimke, ako je názov a popis výnimky a stav programu, kedy k výnimke došlo.

Hlavné dôvody, prečo nastane výnimka

  • Neplatný vstup používateľa
  • Porucha zariadenia
  • Strata sieťového pripojenia
  • Fyzické obmedzenia (nedostatok pamäte na disku)
  • Chyby v kóde
  • Otváranie nedostupného súboru

Chyby predstavujú neopraviteľné stavy, ako je nedostatok pamäte Java virtuálneho stroja (JVM), úniky pamäte, chyby pretečenia zásobníka, nekompatibilita knižníc, nekonečná rekurzia atď. Chyby sú zvyčajne mimo kontroly programátora a nemali by sme sa pokúšať chyby riešiť.



Rozdiel medzi chybou a výnimkou

Poďme diskutovať o najdôležitejšej časti, ktorou je rozdiely medzi chybou a výnimkou je to takto:

  • Chyba: Chyba označuje vážny problém, ktorý by sa rozumná aplikácia nemala pokúšať zachytiť.
  • Výnimka: Výnimka označuje podmienky, ktoré by sa rozumná aplikácia mohla pokúsiť zachytiť.

Hierarchia výnimiek

Všetky typy výnimiek a chýb sú podtriedy triedy Vhadzovateľné , čo je základná trieda hierarchie. Jedna pobočka vedie Výnimka . Táto trieda sa používa pre výnimočné stavy, ktoré by mali užívateľské programy zachytiť. NullPointerException je príkladom takejto výnimky. Ďalšia pobočka, Chyba používa run-time systém Java ( JVM ) na označenie chýb, ktoré súvisia so samotným run-time prostredím (JRE). StackOverflowError je príkladom takejto chyby.

Hierarchia výnimiek v Jave

Hierarchia výnimiek Java

Typy výnimiek

Java definuje niekoľko typov výnimiek, ktoré sa týkajú jej rôznych knižníc tried. Java tiež umožňuje používateľom definovať svoje vlastné výnimky.

typy výnimiek v jazyku Java

Výnimky možno kategorizovať dvoma spôsobmi:

  1. Vstavané výnimky
    • Začiarknutá výnimka
    • Nezačiarknutá výnimka
  2. Používateľom definované výnimky

Poďme diskutovať o vyššie definovanej výnimke, ktorá je nasledovná:

1. Vstavané výnimky

Zabudované výnimky sú výnimky, ktoré sú dostupné v knižniciach Java. Tieto výnimky sú vhodné na vysvetlenie určitých chybových situácií.

  • Skontrolované výnimky: Kontrolované výnimky sa nazývajú výnimky v čase kompilácie, pretože tieto výnimky kontroluje kompilátor v čase kompilácie.
  • Nezačiarknuté výnimky: Nekontrolované výnimky sú presne opačné ako začiarknuté výnimky. Kompilátor nebude kontrolovať tieto výnimky v čase kompilácie. Jednoducho povedané, ak program vyvolá nekontrolovanú výnimku, a aj keby sme ju nespracovali alebo nedeklarovali, program by neposkytol chybu kompilácie.

Poznámka: Pre začiarknutú a nezačiarknutú výnimku pozri Začiarknuté vs nezačiarknuté výnimky

2. Používateľom definované výnimky:

Niekedy vstavané výnimky v Jave nedokážu opísať určitú situáciu. V takýchto prípadoch môžu používatelia vytvárať aj výnimky, ktoré sa nazývajú „používateľom definované výnimky“.

The výhody spracovania výnimiek v jazyku Java sú nasledujúce:

  1. Poskytnutie dokončenia vykonávania programu
  2. Jednoduchá identifikácia kódu programu a kódu na spracovanie chýb
  3. Šírenie chýb
  4. Zmysluplné hlásenie chýb
  5. Identifikácia typov chýb

Spôsoby tlače informácií o výnimke:

1. printStackTrace()

Táto metóda vytlačí informácie o výnimke vo formáte Názov výnimky: popis výnimky, sledovanie zásobníka.

Príklad:

Java




//program to print the exception information using printStackTrace() method> > import> java.io.*;> > class> GFG {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >e.printStackTrace();> >}> >}> }>

>

>

Výkon

java.lang.ArithmeticException: / by zero at GFG.main(File.java:10)>

2. toString()

Metóda toString() vypíše informácie o výnimke vo formáte Názov výnimky: popis výnimky.

Príklad:

Java




//program to print the exception information using toString() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.toString());> >}> >}> }>

>

>

Výkon

java.lang.ArithmeticException: / by zero>

3. getMessage()

Metóda getMessage() vypíše iba popis výnimky.

Príklad:

Java




//program to print the exception information using getMessage() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.getMessage());> >}> >}> }>

zoznam náboženstiev

>

>

Výkon

/ by zero>

Ako JVM rieši výnimku?

Predvolené spracovanie výnimiek: Kedykoľvek v rámci metódy, ak sa vyskytne výnimka, metóda vytvorí objekt známy ako objekt výnimky a odovzdá ho run-time systému (JVM). Objekt výnimky obsahuje názov a popis výnimky a aktuálny stav programu, kde sa výnimka vyskytla. Vytvorenie objektu výnimky a manipulácia s ním v run-time systéme sa nazýva vyvolanie výnimky. Môže existovať zoznam metód, ktoré boli volané, aby sa dostali k metóde, kde sa vyskytla výnimka. Tento usporiadaný zoznam metód sa nazýva Zásobník hovorov . Teraz sa uskutoční nasledujúci postup.

  • Run-time systém prehľadáva zásobník hovorov, aby našiel metódu, ktorá obsahuje blok kódu, ktorý dokáže spracovať vzniknutú výnimku. Blok kódu sa nazýva an Obsluha výnimiek .
  • Run-time systém začne hľadať od metódy, v ktorej sa vyskytla výnimka, a pokračuje cez zásobník volaní v opačnom poradí, v akom boli volané metódy.
  • Ak nájde vhodný handler, odovzdá mu vzniknutú výnimku. Vhodný obslužný program znamená, že typ vyvolaného objektu výnimky sa zhoduje s typom objektu výnimky, ktorý dokáže spracovať.
  • Ak run-time systém prehľadáva všetky metódy v zásobníku hovorov a nemôže nájsť vhodný obslužný program, potom run-time systém odovzdá objekt výnimky predvolená obsluha výnimky , ktorý je súčasťou run-time systému. Tento obslužný program vytlačí informácie o výnimke v nasledujúcom formáte a ukončí program nenormálne .
Exception in thread 'xxx' Name of Exception : Description ... ...... .. // Call Stack>

Pozrite sa na nižšie uvedený diagram, aby ste pochopili tok zásobníka hovorov.

Tok zásobníka tried pre výnimky v jazyku Java

Ilustrácia:

Java




// Java Program to Demonstrate How Exception Is Thrown> > // Class> // ThrowsExecp> class> GFG {> > >// Main driver method> >public> static> void> main(String args[])> >{> >// Taking an empty string> >String str =>null>;> >// Getting length of a string> >System.out.println(str.length());> >}> }>

>

>

Výkon

výstup programu

Pozrime sa na príklad, ktorý ilustruje, ako run-time systém hľadá vhodný kód spracovania výnimiek v zásobníku hovorov.

Príklad:

Java




// Java Program to Demonstrate Exception is Thrown> // How the runTime System Searches Call-Stack> // to Find Appropriate Exception Handler> > // Class> // ExceptionThrown> class> GFG {> > >// Method 1> >// It throws the Exception(ArithmeticException).> >// Appropriate Exception handler is not found> >// within this method.> >static> int> divideByZero(>int> a,>int> b)> >{> > >// this statement will cause ArithmeticException> >// (/by zero)> >int> i = a / b;> > >return> i;> >}> > >// The runTime System searches the appropriate> >// Exception handler in method also but couldn't have> >// found. So looking forward on the call stack> >static> int> computeDivision(>int> a,>int> b)> >{> > >int> res =>0>;> > >// Try block to check for exceptions> >try> {> > >res = divideByZero(a, b);> >}> > >// Catch block to handle NumberFormatException> >// exception Doesn't matches with> >// ArithmeticException> >catch> (NumberFormatException ex) {> >// Display message when exception occurs> >System.out.println(> >'NumberFormatException is occurred'>);> >}> >return> res;> >}> > >// Method 2> >// Found appropriate Exception handler.> >// i.e. matching catch block.> >public> static> void> main(String args[])> >{> > >int> a =>1>;> >int> b =>0>;> > >// Try block to check for exceptions> >try> {> >int> i = computeDivision(a, b);> >}> > >// Catch block to handle ArithmeticException> >// exceptions> >catch> (ArithmeticException ex) {> > >// getMessage() will print description> >// of exception(here / by zero)> >System.out.println(ex.getMessage());> >}> >}> }>

>

>

Výkon

/ by zero>

Ako programátor zvládne výnimku?

Prispôsobené spracovanie výnimiek: Spracovanie výnimiek Java sa riadi pomocou piatich kľúčových slov: skúste , chytiť , hodiť , hádže , a konečne . Stručne povedané, tu je, ako fungujú. Programové príkazy, o ktorých si myslíte, že môžu vyvolať výnimky, sú obsiahnuté v bloku try. Ak sa v bloku try vyskytne výnimka, je vyvolaná. Váš kód môže zachytiť túto výnimku (pomocou catch bloku) a spracovať ju nejakým racionálnym spôsobom. Systémom generované výnimky sú automaticky vyvolané runtime systémom Java. Na manuálne vyvolanie výnimky použite kľúčové slovo throw. Akákoľvek výnimka, ktorá je vyhodená z metódy, musí byť ako taká špecifikovaná klauzulou throws. Akýkoľvek kód, ktorý sa musí bezpodmienečne vykonať po dokončení bloku try, sa vloží do bloku konečne.

Tip: Človek musí prejsť kontrola toku v skúste chytiť nakoniec blokovať pre lepšie pochopenie.

Potreba klauzuly pokusného úlovku (prispôsobené spracovanie výnimiek)

Zvážte nižšie uvedený program, aby ste lepšie porozumeli klauzule o pokuse o úlovok.

Príklad:

k-nn algoritmus

Java




// Java Program to Demonstrate> // Need of try-catch Clause> > // Class> class> GFG {> > >// Main driver method> >public> static> void> main(String[] args)> >{> >// Taking an array of size 4> >int>[] arr =>new> int>[>4>];> > >// Now this statement will cause an exception> >int> i = arr[>4>];> > >// This statement will never execute> >// as above we caught with an exception> >System.out.println(>'Hi, I want to execute'>);> >}> }>

>

>

Výkon

výstup programu

Vysvetlenie výstupu: Vo vyššie uvedenom príklade je pole definované s veľkosťou, t. j. môžete pristupovať k prvkom iba od indexu 0 až 3. Ale pokúšate sa pristupovať k prvkom na indexe 4 (omylom), preto vyvoláva výnimku. V tomto prípade JVM ukončí program nenormálne . Príkaz System.out.println(Ahoj, chcem vykonať); nikdy nevykonajú. Na jej vykonanie musíme výnimku spracovať pomocou try-catch. Preto, aby sme pokračovali v normálnom toku programu, potrebujeme klauzulu try-catch.

Ako používať klauzulu Try-catch?

try {  // block of code to monitor for errors  // the code you think can raise an exception } catch (ExceptionType1 exOb) {  // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) {  // exception handler for ExceptionType2 } // optional finally { // block of code to be executed after try block ends  }>

Je potrebné pamätať na niektoré kľúčové body, ktoré sú nasledovné:

  • V metóde môže existovať viac ako jeden príkaz, ktorý môže vyvolať výnimku, takže všetky tieto príkazy vložte do svojich vlastných skúste blokovať a poskytovať samostatný obslužný program výnimiek v rámci svojich vlastných chytiť blok pre každú z nich.
  • Ak sa vyskytne výnimka v rámci skúste bloku, túto výnimku spracuje obsluha výnimky, ktorá je s ňou spojená. Na priradenie obsluhy výnimiek musíme vložiť a chytiť zablokovať po ňom. Môže existovať viac ako jeden obslužný program výnimiek. Každý chytiť block je obslužná rutina výnimky, ktorá spracováva výnimku z typu označeného jej argumentom. Argument ExceptionType deklaruje typ výnimky, ktorú dokáže spracovať, a musí to byť názov triedy, ktorá zdedí z Vhadzovateľné trieda.
  • Pre každý blok pokusu môže byť nula alebo viac blokov catch, ale len jeden záverečný blok.
  • Posledný blok je voliteľný. Vždy sa vykoná, či sa v bloku try vyskytla výnimka alebo nie. Ak sa vyskytne výnimka, potom sa vykoná skúste chytiť bloky. A ak sa výnimka nevyskytne, vykoná sa po skúste blokovať. Posledný blok v jazyku Java sa používa na vloženie dôležitých kódov, ako je napríklad čistiaci kód, napríklad zatvorenie súboru alebo zatvorenie pripojenia.
  • Ak do bloku try napíšeme System.exit, tak sa nakoniec blok nevykoná.

Zhrnutie je znázornené pomocou vizuálnej pomôcky nižšie takto:

Výnimky v Jave

Súvisiace články:

Súvisiace kurzy

Java Programming Foundation – Kurz s vlastným tempom

Nájdite ten správny kurz, aby ste sa mohli začať učiť Java Programming Foundation od odborníkov z odvetvia s dlhoročnými skúsenosťami. Toto Java Programming Foundation – Kurz s vlastným tempom pokrýva základy Programovací jazyk Java, dátové typy, operátory a riadenie toku, slučky, reťazce , a oveľa viac. Už žiadne čakanie! Začnite sa učiť JAVA a staňte sa úplným Java inžinierom!