U ovom uputstvu naučit ćemo obrađivati višestruke iznimke u Javi uz pomoć primjera.
Prije Jave 7, morali smo napisati više kodova za rukovanje iznimkama za različite vrste iznimaka, čak i ako je postojala suvišnost koda.
Uzmimo primjer.
Primjer 1: Više blokova ulova
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()); ) ) )
Izlaz
/ po nuli
U ovom primjeru mogu se dogoditi dvije iznimke:
ArithmeticExceptionjer pokušavamo podijeliti broj s 0.ArrayIndexOutOfBoundsExceptionjer smo proglasili novi cjelobrojni niz s granicama polja 0 do 9 i pokušavamo dodijeliti vrijednost indeksu 10.
Ispisujemo poruku o iznimci u oba catchbloka, tj. Duplicirani kôd.
Asocijativnost operatora dodjele =je zdesna nalijevo, pa ArithmeticExceptionse prvo baca poruka s nulom.
Obrađivati višestruke iznimke u bloku catch
U Javi SE 7 i novijim verzijama sada možemo uhvatiti više vrsta iznimki u jednom catchbloku.
Svaka vrsta iznimke s kojom catchblok može rukovati razdvaja se pomoću okomite šipke ili cijevi |.
Njegova sintaksa je:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Primjer 2: Blok s više ulova
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()); ) ) )
Izlaz
/ po nuli
Hvatanje višestrukih iznimaka u jednom catchbloku smanjuje dupliciranje koda i povećava učinkovitost.
Bajtkod stvoren tijekom sastavljanja ovog programa bit će manji od programa koji ima više catchblokova jer nema suvišne kode.
Napomena: Ako catchblok obrađuje višestruke iznimke, parametar catch je implicitno final. To znači da ne možemo dodijeliti nikakve vrijednosti za hvatanje parametara.
Baza za hvatanje Izuzetak
Prilikom hvatanja više iznimaka u jednom catchbloku, pravilo se generalizira na specijalizirano.
To znači da ako u catchbloku postoji hijerarhija izuzetaka , osnovnu iznimku možemo uhvatiti samo umjesto da uhvatimo višestruke specijalizirane iznimke.
Uzmimo primjer.
Primjer 3: Hvatanje samo osnovne klase iznimke
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()); ) ) )
Izlaz
/ po nuli
Znamo da su sve klase iznimki potklase Exceptionklase. Dakle, umjesto da uhvatimo višestruke specijalizirane iznimke, jednostavno možemo uhvatiti Exceptionklasu.
Ako je osnovna klasa iznimke već navedena u catchbloku, nemojte koristiti podređene klase iznimke u istom catchbloku. U suprotnom, dobit ćemo pogrešku u kompilaciji.
Uzmimo primjer.
Primjer 4: Hvatanje osnovne i podređene klase djece
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()); ) ) )
Izlaz
Main.java:6: pogreška: Alternative u naredbi s više ulova ne mogu se povezati potklasiranjem
U ovom su primjeru ArithmeticExceptioni ArrayIndexOutOfBoundsExceptionobje potklase Exceptionklase. Dakle, dobivamo pogrešku u kompilaciji.








