V tomto tutoriále sa naučíme narábať s viacerými výnimkami v Jave pomocou príkladov.
Pred jazykom Java 7 sme museli napísať viac kódov na spracovanie výnimiek pre rôzne typy výnimiek, aj keď došlo k redundancii kódu.
Zoberme si príklad.
Príklad 1: Viacero blokov úlovku
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Výkon
/ nulou
V tomto príklade sa môžu vyskytnúť dve výnimky:
ArithmeticException
pretože sa pokúšame rozdeliť číslo na 0.ArrayIndexOutOfBoundsException
pretože sme deklarovali nové celočíselné pole s hranicami poľa 0 až 9 a pokúšame sa priradiť hodnotu indexu 10.
Tlačíme správu o výnimke v obidvoch catch
blokoch, tj. Duplikát kódu.
Asociativita operátora priradenia =
je sprava doľava, preto ArithmeticException
sa najskôr hodí správa so správou / o nulu.
Spracovať viac výnimiek v bloku catch
V prostredí Java SE 7 a novších verziách teraz môžeme zachytiť viac ako jeden typ výnimky v jednom catch
bloku.
Každý typ výnimky, ktorý môže catch
blok spracovať, je oddelený pomocou zvislej čiary alebo rúry |
.
Jeho syntax je:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Príklad 2: Blok s viacerými úlovkami
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Výkon
/ nulou
Zachytenie viacerých výnimiek v jednom catch
bloku znižuje duplikáciu kódu a zvyšuje efektivitu.
Bajtkód vygenerovaný pri kompilácii tohto programu bude menší ako program s viacerými catch
blokmi, pretože nedochádza k redundancii kódu.
Poznámka: Ak catch
blok spracováva viac výnimiek, parameter catch je implicitne final
. To znamená, že parametrom úlovku nemôžeme priradiť žiadne hodnoty.
Základňa výlovu Výnimka
Pri chytaní viacerých výnimiek do jedného catch
bloku sa pravidlo zovšeobecní na špecializované.
To znamená, že ak v catch
bloku existuje hierarchia výnimiek , môžeme základnú výnimku zachytiť iba namiesto chytania viacerých špecializovaných výnimiek.
Zoberme si príklad.
Príklad 3: Chytanie iba základnej triedy výnimiek
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) )
Výkon
/ nulou
Vieme, že všetky triedy výnimiek sú podtriedami Exception
triedy. Takže namiesto toho, aby sme chytili viac špecializovaných výnimiek, môžeme Exception
triedu jednoducho chytiť .
Ak už bola v catch
bloku zadaná základná trieda výnimiek , nepoužívajte v tom istom catch
bloku podradené triedy výnimiek . V opačnom prípade sa zobrazí chyba kompilácie.
Zoberme si príklad.
Príklad 4: Chytanie základných a podradených tried výnimiek
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Výkon
Main.java:6: chyba: Alternatívy vo vyhlásení o viacerých úlovkoch nemôžu byť spojené podtriedou
V tomto príklade, ArithmeticException
a ArrayIndexOutOfBoundsException
sú obaja podtriedy Exception
triedy. Dostali sme teda chybu kompilácie.