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 catch
blokken, dwz dubbele code.
De associativiteit van de toewijzingsoperator =
is van rechts naar links, dus een ArithmeticException
wordt 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 catch
blok opvangen .
Elk uitzonderingstype dat door het catch
blok 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 catch
blok 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 catch
blokken, aangezien er geen code-redundantie is.
Opmerking: als een catch
blok 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 catch
blok, wordt de regel gegeneraliseerd naar gespecialiseerd.
Dit betekent dat als er een hiërarchie van uitzonderingen in het catch
blok 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 Exception
klasse zijn. Dus in plaats van meerdere gespecialiseerde uitzonderingen te vangen, kunnen we gewoon de Exception
klas vangen .
Als de basisuitzonderingsklasse al in het catch
blok is opgegeven , gebruik dan geen onderliggende uitzonderingsklassen in hetzelfde catch
blok. 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, ArithmeticException
en ArrayIndexOutOfBoundsException
zijn beide subklassen van de Exception
klasse. We krijgen dus een compilatiefout.