I denne opplæringen vil vi lære å håndtere flere unntak i Java ved hjelp av eksempler.
Før Java 7 måtte vi skrive flere unntakshåndteringskoder for forskjellige typer unntak selv om det var kodeunderskudd.
La oss ta et eksempel.
Eksempel 1: Flere fangstblokker
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()); ) ) )
Produksjon
/ ved null
I dette eksemplet kan to unntak forekomme:
ArithmeticException
fordi vi prøver å dele et tall med 0.ArrayIndexOutOfBoundsException
fordi vi har deklarert et nytt heltall array med array grenser 0 til 9 og vi prøver å tilordne en verdi til indeks 10.
Vi skriver ut unntaksmeldingen i begge catch
blokkene, dvs. duplikatkode.
Assosiativiteten til oppdragsoperatøren =
er fra høyre mot venstre, så en ArithmeticException
blir kastet først med meldingen / av null.
Håndter flere unntak i en fangstblokk
I Java SE 7 og senere kan vi nå fange mer enn én type unntak i en enkelt catch
blokk.
Hver unntakstype som kan håndteres av catch
blokken, skilles ved hjelp av en vertikal stang eller et rør |
.
Dens syntaks er:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Eksempel 2: Blokk med flere fangster
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()); ) ) )
Produksjon
/ ved null
Å fange flere unntak i en enkelt catch
blokk reduserer duplisering av kode og øker effektiviteten.
Bytekoden som genereres under kompilering av dette programmet, vil være mindre enn at programmet har flere catch
blokker, da det ikke er noen kodedundans.
Merk: Hvis en catch
blokk håndterer flere unntak, er fangstparameteren implisitt final
. Dette betyr at vi ikke kan tilordne noen verdier til fangstparametere.
Fangbase Unntak
Når du fanger flere unntak i en catch
blokk, blir regelen generalisert til spesialisert.
Dette betyr at hvis det er et hierarki med unntak i catch
blokken, kan vi bare fange basis unntaket i stedet for å fange flere spesialiserte unntak.
La oss ta et eksempel.
Eksempel 3: Bare fangstgrunnlagsundtakelse
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()); ) ) )
Produksjon
/ ved null
Vi vet at alle unntaksklassene er underklasser av Exception
klassen. Så, i stedet for å fange flere spesialiserte unntak, kan vi ganske enkelt ta Exception
klassen.
Hvis basen unntaksklassen allerede er spesifisert i catch
blokken, må du ikke bruke barn unntaksklasser i den samme catch
blokken. Ellers får vi en kompileringsfeil.
La oss ta et eksempel.
Eksempel 4: Fangstbase og unntaksklasser for barn
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()); ) ) )
Produksjon
Main.java:6: feil: Alternativer i en multi-catch-setning kan ikke relateres ved å underklasse
I dette eksemplet, ArithmeticException
og ArrayIndexOutOfBoundsException
er begge underklasser av Exception
klassen. Så vi får en kompileringsfeil.