Java fångar flera undantag

I den här handledningen lär vi oss att hantera flera undantag i Java med hjälp av exempel.

Innan Java 7 var vi tvungna att skriva flera koder för undantagshantering för olika typer av undantag även om det fanns kodredundans.

Låt oss ta ett exempel.

Exempel 1: Flera fångstblock

 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

 / med noll 

I det här exemplet kan två undantag förekomma:

  • ArithmeticException eftersom vi försöker dela ett tal med 0.
  • ArrayIndexOutOfBoundsException eftersom vi har förklarat en ny heltalmatris med arraygränserna 0 till 9 och vi försöker tilldela ett värde till index 10.

Vi skriver ut undantagsmeddelandet i båda catchblocken, dvs. duplikatkod.

Associeringsförmågan hos uppdragsoperatören =är från höger till vänster, så en ArithmeticExceptionkastas först med meddelandet / med noll.

Hantera flera undantag i ett fångstblock

I Java SE 7 och senare kan vi nu fånga mer än en typ av undantag i ett enda catchblock.

Varje undantagstyp som kan hanteras av catchblocket separeras med en vertikal stång eller rör |.

Dess syntax är:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Exempel 2: Multi-catch block

 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

 / med noll 

Att fånga flera undantag i ett catchblock minskar duplicering av kod och ökar effektiviteten.

Bytkoden som genereras under kompilering av detta program kommer att vara mindre än programmet som har flera catchblock eftersom det inte finns någon kodredundans.

Obs: Om ett catchblock hanterar flera undantag är fångstparametern implicit final. Det betyder att vi inte kan tilldela några värden för att fånga parametrar.

Fångstbas Undantag

När du fångar flera undantag i ett enda catchblock generaliseras regeln till specialiserad.

Det betyder att om det finns en hierarki av undantag i catchblocket kan vi bara fånga basundantaget istället för att fånga flera specialiserade undantag.

Låt oss ta ett exempel.

Exempel 3: Fångar endast basundantagsklass

 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

 / med noll 

Vi vet att alla undantagsklasser är underklasser i Exceptionklassen. Så istället för att fånga flera specialiserade undantag kan vi helt enkelt fånga Exceptionklassen.

Om basundantagsklassen redan har specificerats i catchblocket, använd inte barnundantagsklasser i samma catchblock. Annars får vi ett kompileringsfel.

Låt oss ta ett exempel.

Exempel 4: Fångstklasser och undantagsklasser för 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()); ) ) ) 

Produktion

 Main.java:6: fel: Alternativ i ett multi-catch-uttalande kan inte relateras genom underklassificering 

I detta exempel, ArithmeticExceptionoch ArrayIndexOutOfBoundsExceptionär båda underklasser av Exceptionklassen. Så vi får ett kompileringsfel.

Intressanta artiklar...