Zpracování výjimek v Javě je jedním z účinných prostředků pro řešení chyb za běhu, aby bylo možné zachovat pravidelný tok aplikace. Java Exception Handling je mechanismus pro zpracování runtime chyb, jako jsou ClassNotFoundException, IOException, SQLException, RemoteException atd.
Co jsou výjimky Java?
V Javě, výjimka je nechtěná nebo neočekávaná událost, ke které dochází během provádění programu, tedy za běhu, která narušuje normální tok instrukcí programu. Výjimky může program zachytit a zpracovat. Když v rámci metody dojde k výjimce, vytvoří se objekt. Tento objekt se nazývá objekt výjimky. Obsahuje informace o výjimce, jako je název a popis výjimky a stav programu, kdy k výjimce došlo.
Hlavní důvody, proč dojde k výjimce
- Neplatný vstup uživatele
- Selhání zařízení
- Ztráta připojení k síti
- Fyzická omezení (nedostatek paměti na disku)
- Chyby v kódu
- Otevírání nedostupného souboru
Chyby představují neopravitelné stavy, jako je nedostatek paměti Java virtuálního stroje (JVM), úniky paměti, chyby přetečení zásobníku, nekompatibilita knihoven, nekonečná rekurze atd. Chyby jsou obvykle mimo kontrolu programátora a neměli bychom se snažit chyby řešit.
Rozdíl mezi chybou a výjimkou
Pojďme diskutovat o nejdůležitější části, kterou je rozdíly mezi chybou a výjimkou je to takto:
- Chyba: Chyba označuje vážný problém, který by se rozumná aplikace neměla snažit zachytit.
- Výjimka: Výjimka označuje podmínky, které by se rozumná aplikace mohla pokusit zachytit.
Hierarchie výjimek
Všechny typy výjimek a chyb jsou podtřídami třídy Vhazovatelné , což je základní třída hierarchie. Jedna větev je vedena Výjimka . Tato třída se používá pro výjimečné stavy, které by měly uživatelské programy zachytit. NullPointerException je příkladem takové výjimky. Další větev, Chyba je používán běhovým systémem Java ( JVM ) k označení chyb souvisejících se samotným běhovým prostředím (JRE). StackOverflowError je příkladem takové chyby.

Hierarchie výjimek Java
Typy výjimek
Java definuje několik typů výjimek, které se týkají jejích různých knihoven tříd. Java také umožňuje uživatelům definovat své vlastní výjimky.

Výjimky lze kategorizovat dvěma způsoby:
- Vestavěné výjimky
- Zaškrtnutá výjimka
- Nezaškrtnutá výjimka
- Uživatelsky definované výjimky
Pojďme diskutovat o výše definované výjimce, která je následující:
1. Vestavěné výjimky
Vestavěné výjimky jsou výjimky, které jsou dostupné v knihovnách Java. Tyto výjimky jsou vhodné pro vysvětlení určitých chybových situací.
řetězec java
- Zaškrtnuté výjimky: Kontrolované výjimky se nazývají výjimky v době kompilace, protože tyto výjimky kontroluje kompilátor v době kompilace.
- Nezaškrtnuté výjimky: Nezaškrtnuté výjimky jsou přesně opačné než zaškrtnuté výjimky. Kompilátor nebude kontrolovat tyto výjimky v době kompilace. Jednoduše řečeno, pokud program vyvolá nekontrolovanou výjimku, a i když jsme ji nezpracovali nebo nedeklarovali, program by nehlásil chybu kompilace.
Poznámka: Zaškrtnutá vs nekontrolovaná výjimka viz Zaškrtnuté vs nezaškrtnuté výjimky
2. Uživatelem definované výjimky:
Někdy vestavěné výjimky v Javě nejsou schopny popsat určitou situaci. V takových případech mohou uživatelé také vytvářet výjimky, které se nazývají „uživatelem definované výjimky“.
The výhody zpracování výjimek v Javě jsou následující:
- Zajištění dokončení realizace programu
- Snadná identifikace kódu programu a kódu pro zpracování chyb
- Šíření chyb
- Smysluplné hlášení chyb
- Identifikace typů chyb
Způsoby tisku informací o výjimce:
1. printStackTrace()
Tato metoda vytiskne informace o výjimce ve formátu Název výjimky: popis výjimky, trasování zásobníku.
Příklad:
Jáva
//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ýstup
java.lang.ArithmeticException: / by zero at GFG.main(File.java:10)>
2. toString()
Metoda toString() vytiskne informace o výjimce ve formátu Název výjimky: popis výjimky.
Příklad:
Jáva
//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());> > }> > }> }> |
>
jsp
>
Výstup
java.lang.ArithmeticException: / by zero>
3. getMessage()
Metoda getMessage() vytiskne pouze popis výjimky.
Příklad:
Jáva
//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());> > }> > }> }> |
stringformat
>
>
Výstup
/ by zero>
Jak JVM zpracovává výjimku?
Výchozí zpracování výjimek: Kdykoli uvnitř metody dojde k výjimce, metoda vytvoří objekt známý jako objekt výjimky a předá jej běhovému systému (JVM). Objekt výjimky obsahuje název a popis výjimky a aktuální stav programu, kde k výjimce došlo. Vytvoření objektu výjimky a manipulace s ním v běhovém systému se nazývá vyvolání výjimky. Může existovat seznam metod, které byly volány, aby se dostaly k metodě, kde došlo k výjimce. Tento uspořádaný seznam metod se nazývá Zásobník volání . Nyní proběhne následující postup.
- Běhový systém prohledá zásobník volání a najde metodu, která obsahuje blok kódu, který dokáže zpracovat nastalou výjimku. Blok kódu se nazývá an Obsluha výjimek .
- Běhový systém začne hledat od metody, ve které došlo k výjimce, a pokračuje přes zásobník volání v opačném pořadí, v jakém byly volány metody.
- Pokud najde vhodný handler, předá mu nastalou výjimku. Vhodný obslužný program znamená, že typ vyvolaného objektu výjimky odpovídá typu objektu výjimky, který dokáže zpracovat.
- Pokud běhový systém prohledá všechny metody v zásobníku volání a nemůže najít vhodný obslužný program, pak běhový systém předá objekt výjimky výchozí obslužná rutina výjimek , který je součástí run-time systému. Tento obslužný program vytiskne informace o výjimce v následujícím formátu a ukončí program abnormálně .
Exception in thread 'xxx' Name of Exception : Description ... ...... .. // Call Stack>
Podívejte se na níže uvedený diagram, abyste pochopili tok zásobníku volání.

Ilustrace:
Jáva
// 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ýstup

Podívejme se na příklad, který ilustruje, jak run-time systém hledá vhodný kód pro zpracování výjimek v zásobníku volání.
Příklad:
Jáva
třída java skeneru
// 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());> > }> > }> }> |
>
>
15 ze 100,00Výstup
/ by zero>
Jak programátor řeší výjimku?
Přizpůsobené zpracování výjimek: Zpracování výjimek Java je spravováno pomocí pěti klíčových slov: Snaž se , chytit , házet , hází , a Konečně . Stručně řečeno, jak fungují. Programové příkazy, o kterých si myslíte, že mohou vyvolávat výjimky, jsou obsaženy v bloku try. Pokud se v bloku try vyskytne výjimka, je vyvolána. Váš kód může zachytit tuto výjimku (pomocí catch bloku) a zpracovat ji nějakým racionálním způsobem. Systémem generované výjimky jsou automaticky vyvolány běhovým systémem Java. Chcete-li výjimku vyvolat ručně, použijte klíčové slovo throw. Jakákoli výjimka, která je vyvolána z metody, musí být jako taková specifikována klauzulí throws. Jakýkoli kód, který musí být bezpodmínečně proveden po dokončení bloku try, je vložen do bloku final.
Spropitné: Člověk musí projít kontrola toku v zkuste catch nakonec blokovat pro lepší pochopení.
Potřeba klauzule try-catch (přizpůsobené zpracování výjimek)
Zvažte níže uvedený program, abyste lépe porozuměli klauzuli try-catch.
Příklad:
Jáva
// 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ýstup

Vysvětlení výstupu: Ve výše uvedeném příkladu je pole definováno s velikostí, tj. můžete přistupovat k prvkům pouze od indexu 0 do 3. Ale vy se pokoušíte přistupovat k prvkům na indexu 4 (omylem), proto vyvolává výjimku. V tomto případě JVM ukončí program abnormálně . Příkaz System.out.println(Ahoj, chci provést); nikdy neprovede. Abychom ji provedli, musíme výjimku zpracovat pomocí try-catch. Abychom tedy mohli pokračovat v normálním toku programu, potřebujeme klauzuli try-catch.
Jak používat doložku 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 třeba mít na paměti některé klíčové body, které jsou následující:
- V metodě může existovat více než jeden příkaz, který může způsobit výjimku, takže vložte všechny tyto příkazy do jejich vlastních Snaž se blokovat a poskytovat samostatnou obslužnou rutinu výjimek v rámci své vlastní chytit blok pro každý z nich.
- Pokud dojde k výjimce v rámci Snaž se bloku, tuto výjimku zpracuje obslužná rutina výjimky, která je s ní spojena. Abychom přidružili obsluhu výjimky, musíme vložit a chytit zablokovat po něm. Může existovat více než jeden obslužný program výjimky. Každý chytit block je obsluha výjimky, která zpracovává výjimku typu označeného jeho argumentem. Argument ExceptionType deklaruje typ výjimky, kterou dokáže zpracovat, a musí to být název třídy, která zdědí z Vhazovatelné třída.
- Pro každý blok try může být nula nebo více bloků catch, ale jen jeden závěrečný blok.
- Závěrečný blok je volitelný. Vždy se provede, ať už došlo k výjimce v bloku try nebo ne. Pokud dojde k výjimce, bude provedena poté zkuste chytit bloky. A pokud k výjimce nedojde, bude provedena po Snaž se blok. Závěrečný blok v Javě se používá k vložení důležitých kódů, jako je kód čištění, např. zavření souboru nebo uzavření připojení.
- Pokud do bloku try napíšeme System.exit, nakonec se blok neprovede.
Shrnutí je znázorněno pomocí vizuální pomůcky níže takto:

Související články:
- Typy výjimek v Javě
- Zaškrtnuté vs nezaškrtnuté výjimky
- Throw-Háže v Javě
Související kurzy
Java Programming Foundation – Kurz s vlastním tempem
Najděte si ten správný kurz, abyste se mohli začít učit Java Programming Foundation od odborníků z oboru s dlouholetými zkušenostmi. Tento Java Programming Foundation – Kurz s vlastním tempem pokrývá základy Programovací jazyk Java, datové typy, operátory a řízení toku, smyčky, řetězce , a mnohem víc. Už žádné čekání! Začněte se učit JAVA hned teď a staňte se kompletním Java Engineerem!