Java-vangst Meerdere uitzonderingen
Java catch Meerdere uitzonderingen
In deze tutorial leren we met behulp van voorbeelden om te gaan met meerdere uitzonderingen in Java.
Vóór Java 7 moesten we meerdere uitzonderingsbehandelingscodes 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
/ by zero
In dit voorbeeld kunnen zich twee uitzonderingen voordoen:
ArithmeticException
omdat we een getal proberen te delen door 0.ArrayIndexOutOfBoundsException
omdat we een nieuwe integer-array hebben gedeclareerd met array-grenzen 0 tot 9 en we proberen een waarde toe te wijzen aan index 10.
We printen het uitzonderingsbericht in zowel de catch
blokken, d.w.z. dubbele code.
De associativiteit van de toewijzingsoperator =
is van rechts naar links, dus een ArithmeticException
wordt als eerste gegooid met het bericht
/ by zero
.
Meerdere uitzonderingen in een catch-blok afhandelen
In Java SE 7 en hoger kunnen we nu meer dan één type uitzondering opvangen in één catch
blok.
Elk uitzonderingstype dat kan worden afgehandeld door de catch
blok wordt gescheiden met een verticale balk of pijp |
.
De syntaxis is:
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
Voorbeeld 2:Blok voor meerdere vangsten
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
/ by zero
Meerdere uitzonderingen opvangen in één catch
block vermindert codeduplicatie en verhoogt de efficiëntie.
De bytecode die wordt gegenereerd tijdens het compileren van dit programma zal kleiner zijn dan het programma met meerdere catch
blokkeert omdat er geen coderedundantie is.
Opmerking: Als een catch
blok verwerkt meerdere uitzonderingen, de catch-parameter is impliciet final
. Dit betekent dat we geen waarden kunnen toewijzen aan vangparameters.
Uitzondering vangstbasis
Bij het opvangen van meerdere uitzonderingen in een enkele catch
blok, wordt de regel gegeneraliseerd naar gespecialiseerd.
Dit betekent dat als er een hiërarchie van uitzonderingen is in de catch
blok, kunnen we alleen de basisuitzondering opvangen in plaats van meerdere gespecialiseerde uitzonderingen te vangen.
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
/ by zero
We weten dat alle uitzonderingsklassen subklassen zijn van de Exception
klas. Dus in plaats van meerdere gespecialiseerde uitzonderingen te vangen, kunnen we eenvoudig de Exception
. vangen klasse.
Als de basisuitzonderingsklasse al is opgegeven in de catch
blok, gebruik geen onderliggende uitzonderingsklassen in dezelfde catch
blok. Anders krijgen we een compilatiefout.
Laten we een voorbeeld nemen.
Voorbeeld 4:Vangbasis- en kinduitzonderingsklassen
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: Alternatives in a multi-catch statement cannot be related by subclassing
In dit voorbeeld ArithmeticException
en ArrayIndexOutOfBoundsException
zijn beide subklassen van de Exception
klas. We krijgen dus een compilatiefout.
Java