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:
ArithmeticException
jer pokušavamo podijeliti broj s 0.ArrayIndexOutOfBoundsException
jer smo proglasili novi cjelobrojni niz s granicama polja 0 do 9 i pokušavamo dodijeliti vrijednost indeksu 10.
Ispisujemo poruku o iznimci u oba catch
bloka, tj. Duplicirani kôd.
Asocijativnost operatora dodjele =
je zdesna nalijevo, pa ArithmeticException
se 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 catch
bloku.
Svaka vrsta iznimke s kojom catch
blok 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 catch
bloku smanjuje dupliciranje koda i povećava učinkovitost.
Bajtkod stvoren tijekom sastavljanja ovog programa bit će manji od programa koji ima više catch
blokova jer nema suvišne kode.
Napomena: Ako catch
blok 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 catch
bloku, pravilo se generalizira na specijalizirano.
To znači da ako u catch
bloku 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 Exception
klase. Dakle, umjesto da uhvatimo višestruke specijalizirane iznimke, jednostavno možemo uhvatiti Exception
klasu.
Ako je osnovna klasa iznimke već navedena u catch
bloku, nemojte koristiti podređene klase iznimke u istom catch
bloku. 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 ArithmeticException
i ArrayIndexOutOfBoundsException
obje potklase Exception
klase. Dakle, dobivamo pogrešku u kompilaciji.