Java fängt mehrere Ausnahmen ab
Java fängt mehrere Ausnahmen ab
In diesem Tutorial lernen wir anhand von Beispielen, mehrere Ausnahmen in Java zu behandeln.
Vor Java 7 mussten wir mehrere Ausnahmebehandlungscodes für verschiedene Arten von Ausnahmen schreiben, selbst wenn es Coderedundanz gab.
Nehmen wir ein Beispiel.
Beispiel 1:Mehrere catch-Blöcke
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());
}
}
}
Ausgabe
/ by zero
In diesem Beispiel können zwei Ausnahmen auftreten:
ArithmeticException
weil wir versuchen, eine Zahl durch 0 zu teilen.ArrayIndexOutOfBoundsException
weil wir ein neues Integer-Array mit den Array-Grenzen 0 bis 9 deklariert haben und versuchen, dem Index 10 einen Wert zuzuweisen.
Wir drucken die Ausnahmemeldung sowohl in catch
Blöcke, d.h. doppelter Code.
Die Assoziativität des Zuweisungsoperators =
ist von rechts nach links, also ein ArithmeticException
wird zuerst mit der Nachricht
/ by zero
geworfen .
Mehrere Ausnahmen in einem Catch-Block behandeln
In Java SE 7 und höher können wir jetzt mehr als einen Ausnahmetyp in einem einzigen catch
abfangen blockieren.
Jeder Ausnahmetyp, der von catch
behandelt werden kann Block wird durch einen senkrechten Strich oder senkrechten Strich |
getrennt .
Seine Syntax ist:
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
Beispiel 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());
}
}
}
Ausgabe
/ by zero
Abfangen mehrerer Ausnahmen in einem einzigen catch
Block reduziert die Code-Duplizierung und erhöht die Effizienz.
Der beim Kompilieren dieses Programms generierte Bytecode ist kleiner als das Programm mit mehreren catch
Blöcke, da es keine Coderedundanz gibt.
Hinweis: Wenn ein catch
block behandelt mehrere Ausnahmen, der catch-Parameter ist implizit final
. Das bedeutet, dass wir Catch-Parametern keine Werte zuweisen können.
Basisausnahme abfangen
Beim Abfangen mehrerer Ausnahmen in einem einzigen catch
Block wird die Regel auf spezialisiert verallgemeinert.
Das heißt, wenn es eine Hierarchie von Ausnahmen im catch
gibt -Block können wir nur die Basisausnahme abfangen, anstatt mehrere spezialisierte Ausnahmen abzufangen.
Nehmen wir ein Beispiel.
Beispiel 3:Nur Basis-Ausnahmeklasse abfangen
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());
}
}
}
Ausgabe
/ by zero
Wir wissen, dass alle Ausnahmeklassen Unterklassen von Exception
sind Klasse. Anstatt also mehrere spezialisierte Ausnahmen abzufangen, können wir einfach Exception
abfangen Klasse.
Wenn die Basisausnahmeklasse bereits in catch
angegeben wurde verwenden Sie keine untergeordneten Ausnahmeklassen im selben catch
Block. Andernfalls erhalten wir einen Kompilierungsfehler.
Nehmen wir ein Beispiel.
Beispiel 4:Abfangen von Basis- und untergeordneten Ausnahmeklassen
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());
}
}
}
Ausgabe
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
In diesem Beispiel ArithmeticException
und ArrayIndexOutOfBoundsException
sind beide Unterklassen von Exception
Klasse. Wir erhalten also einen Kompilierungsfehler.
Java