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 catch
blocken, dvs. duplikatkod.
Associeringsförmågan hos uppdragsoperatören =
är från höger till vänster, så en ArithmeticException
kastas 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 catch
block.
Varje undantagstyp som kan hanteras av catch
blocket 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 catch
block minskar duplicering av kod och ökar effektiviteten.
Bytkoden som genereras under kompilering av detta program kommer att vara mindre än programmet som har flera catch
block eftersom det inte finns någon kodredundans.
Obs: Om ett catch
block 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 catch
block generaliseras regeln till specialiserad.
Det betyder att om det finns en hierarki av undantag i catch
blocket 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 Exception
klassen. Så istället för att fånga flera specialiserade undantag kan vi helt enkelt fånga Exception
klassen.
Om basundantagsklassen redan har specificerats i catch
blocket, använd inte barnundantagsklasser i samma catch
block. 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, ArithmeticException
och ArrayIndexOutOfBoundsException
är båda underklasser av Exception
klassen. Så vi får ett kompileringsfel.