Java fanger flere undtagelser

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 catchblokke, dvs. duplikatkode.

Associeringsevnen for tildelingsoperatøren =er højre mod venstre, så et ArithmeticExceptionkastes 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 catchblok.

Hver undtagelsestype, der kan håndteres af catchblokken, 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 catchblok reducerer duplikering af kode og øger effektiviteten.

Bytecoden, der genereres under kompilering af dette program, vil være mindre end programmet, der har flere catchblokke, da der ikke er nogen kodedundans.

Bemærk: Hvis en catchblok 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 catchblok, er reglen generaliseret til specialiseret.

Dette betyder, at hvis der er et hierarki af undtagelser i catchblokken, 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 Exceptionklassen. Så i stedet for at fange flere specialiserede undtagelser kan vi simpelthen fange Exceptionklassen.

Hvis basisundtagelsesklassen allerede er specificeret i catchblokken, skal du ikke bruge underordnede undtagelsesklasser i den samme catchblok. 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, ArithmeticExceptionog ArrayIndexOutOfBoundsExceptioner begge underklasser af Exceptionklassen. Så vi får en kompileringsfejl.

Interessante artikler...