I denne vejledning lærer vi at håndtere flere undtagelser i Java ved hjælp af eksempler.
Før Java 7 måtte vi skrive flere undtagelseshåndteringskoder til forskellige typer undtagelser, selvom der var kodeundersøgelse.
Lad os tage et eksempel.
Eksempel 1: Flere fangstblokke
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()); ) ) )
Produktion
/ ved nul
I dette eksempel kan der forekomme to undtagelser:
ArithmeticException
fordi vi prøver at dele et tal med 0.ArrayIndexOutOfBoundsException
fordi vi har erklæret et nyt heltal array med array grænser 0 til 9, og vi prøver at tildele en værdi til indeks 10.
Vi udskriver undtagelsesmeddelelsen i begge catch
blokke, dvs. duplikatkode.
Associeringsevnen for tildelingsoperatøren =
er højre mod venstre, så et ArithmeticException
kastes først med meddelelsen / nul.
Håndter flere undtagelser i en fangstblok
I Java SE 7 og senere kan vi nu fange mere end en type undtagelse i en enkelt catch
blok.
Hver undtagelsestype, der kan håndteres af catch
blokken, adskilles ved hjælp af en lodret stang eller et rør |
.
Dens syntaks er:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Eksempel 2: Blok 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()); ) ) )
Produktion
/ ved nul
At fange flere undtagelser i en enkelt catch
blok reducerer duplikering af kode og øger effektiviteten.
Bytecoden, der genereres under kompilering af dette program, vil være mindre end programmet, der har flere catch
blokke, da der ikke er nogen kodedundans.
Bemærk: Hvis en catch
blok håndterer flere undtagelser, er fangstparameteren implicit final
. Dette betyder, at vi ikke kan tildele nogen værdier til fangstparametre.
Fangstgrund Undtagelse
Når man fanger flere undtagelser i en enkelt catch
blok, er reglen generaliseret til specialiseret.
Dette betyder, at hvis der er et hierarki af undtagelser i catch
blokken, kan vi kun fange basisundtagelsen i stedet for at fange flere specialiserede undtagelser.
Lad os tage et eksempel.
Eksempel 3: Kun fangstgrundundtagelsesklasse
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()); ) ) )
Produktion
/ ved nul
Vi ved, at alle undtagelsesklasser er underklasser af Exception
klassen. Så i stedet for at fange flere specialiserede undtagelser kan vi simpelthen fange Exception
klassen.
Hvis basisundtagelsesklassen allerede er specificeret i catch
blokken, skal du ikke bruge underordnede undtagelsesklasser i den samme catch
blok. Ellers får vi en kompileringsfejl.
Lad os tage et eksempel.
Eksempel 4: Fangstklasser for base- og børneundtagelse
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()); ) ) )
Produktion
Main.java:6: fejl: Alternativer i en multi-catch-sætning kan ikke relateres ved underklassificering
I dette eksempel, ArithmeticException
og ArrayIndexOutOfBoundsException
er begge underklasser af Exception
klassen. Så vi får en kompileringsfejl.