Multi-Exception Handling in Java meistern
Multi-Exception Handling in Java meistern
Entdecken Sie, wie Sie mehrere Exceptions mit einem einzigen catch-Block fangen, Ihren Code straffen und häufige Fallstricke vermeiden.
Vor Java 7 mussten Entwickler separate catch-Blöcke für jeden Exception-Typ schreiben, selbst wenn die Handling-Logik identisch war.
Betrachten Sie das folgende Szenario.
Beispiel 1: Getrennte catch-Blöcke
class Haupt { 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 unterschiedliche Probleme auftreten:
ArithmeticException– Division durch Null.ArrayIndexOutOfBoundsException– Zugriff auf Index 10 in einem 10-Element-Array.
Beide catch-Blöcke führen dieselbe Aktion aus, was zu dupliziertem Code führt.
Mehrere Exceptions in einem Block fangen
Seit Java SE 7 können Sie mehrere Exception-Typen in einem catch-Block mit dem Pipe-Separator (|) kombinieren.
Syntax:
try { // Code } catch (ExceptionType1 | ExceptionType2 ex) { // Handler }
Beispiel 2: Multi-catch Block
class Haupt { 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
Durch das Zusammenführen der Handler wird der Code sauberer, der Bytecode kleiner und die Wartung einfacher.
Hinweis: In einem Multi-catch ist der Parameter implizit final, sodass Sie ihn nicht neu zuweisen können.
Basisklassen-Exception verwenden
Wenn mehrere gefangene Exceptions einen gemeinsamen Vorfahren teilen, können Sie diesen Vorfahren fangen, statt jede Unterklasse aufzulisten.
Beispiel 3: Basisklasse Exception fangen
class Haupt { 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
Da jede spezifische Exception in Java Exception erweitert, behandelt dieser einzelne catch-Block alle oben genannten Szenarien.
Wenn eine Basisklassen-Exception bereits gefangen wird, löst das Hinzufügen ihrer Unterklassen im selben catch einen Kompilierfehler aus.
Beispiel 4: Ungültige Kombination aus Basis- und Kind-Exceptions
class Haupt { 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
Dieser Fehler tritt auf, weil ArithmeticException und ArrayIndexOutOfBoundsException Unterklassen von Exception sind und somit die Sprachregel verletzen.
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Exception Handling meistern: Try, Catch, Finally und Ressourcen
- Java throw vs. throws: Exception Handling mit praktischen Beispielen meistern
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele