Java vangen meerdere uitzonderingen op

In deze tutorial leren we met behulp van voorbeelden om te gaan met meerdere uitzonderingen in Java.

Vóór Java 7 moesten we meerdere codes voor het afhandelen van uitzonderingen schrijven voor verschillende soorten uitzonderingen, zelfs als er coderedundantie was.

Laten we een voorbeeld nemen.

Voorbeeld 1: Meerdere catch-blokken

 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()); ) ) ) 

Uitvoer

 / bij nul 

In dit voorbeeld kunnen twee uitzonderingen optreden:

  • ArithmeticException omdat we proberen een getal door 0 te delen.
  • ArrayIndexOutOfBoundsException omdat we een nieuwe integerarray hebben gedeclareerd met arraygrenzen van 0 tot 9 en we proberen een waarde toe te wijzen aan index 10.

We printen het uitzonderingsbericht in beide catchblokken, dwz dubbele code.

De associativiteit van de toewijzingsoperator =is van rechts naar links, dus een ArithmeticExceptionwordt als eerste gegooid met het bericht / door nul.

Verwerk meerdere uitzonderingen in een catch-blok

In Java SE 7 en hoger kunnen we nu meer dan één type uitzondering in één catchblok opvangen .

Elk uitzonderingstype dat door het catchblok kan worden afgehandeld , wordt gescheiden door middel van een verticale staaf of buis |.

De syntaxis is:

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

Voorbeeld 2: Multi-catch-blok

 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()); ) ) ) 

Uitvoer

 / bij nul 

Door meerdere uitzonderingen in één catchblok op te vangen, wordt codeduplicatie verminderd en de efficiëntie verhoogd.

De bytecode die wordt gegenereerd tijdens het compileren van dit programma, zal kleiner zijn dan het programma met meerdere catchblokken, aangezien er geen code-redundantie is.

Opmerking: als een catchblok meerdere uitzonderingen verwerkt, is de parameter catch impliciet final. Dit betekent dat we geen waarden kunnen toewijzen om parameters te vangen.

Uitzondering catching base

Bij het opvangen van meerdere uitzonderingen in een enkel catchblok, wordt de regel gegeneraliseerd naar gespecialiseerd.

Dit betekent dat als er een hiërarchie van uitzonderingen in het catchblok is, we alleen de basisuitzondering kunnen opvangen in plaats van meerdere gespecialiseerde uitzonderingen.

Laten we een voorbeeld nemen.

Voorbeeld 3: Alleen basisuitzonderingsklasse vangen

 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()); ) ) ) 

Uitvoer

 / bij nul 

We weten dat alle uitzonderingsklassen subklassen van de Exceptionklasse zijn. Dus in plaats van meerdere gespecialiseerde uitzonderingen te vangen, kunnen we gewoon de Exceptionklas vangen .

Als de basisuitzonderingsklasse al in het catchblok is opgegeven , gebruik dan geen onderliggende uitzonderingsklassen in hetzelfde catchblok. Anders krijgen we een compilatiefout.

Laten we een voorbeeld nemen.

Voorbeeld 4: basisklassen en onderliggende uitzonderingsklassen opvangen

 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()); ) ) ) 

Uitvoer

 Main.java:6: error: Alternatieven in een multi-catch-instructie kunnen niet worden gerelateerd door subklassen 

In dit voorbeeld, ArithmeticExceptionen ArrayIndexOutOfBoundsExceptionzijn beide subklassen van de Exceptionklasse. We krijgen dus een compilatiefout.

Interessante artikelen...