EMZETT.
Login

Multiple Exceptions

Kurz: Mehrere catch-Blöcke (oder ein kombinierter Block mit |) hinter einem try, um unterschiedliche Fehlerarten unterschiedlich zu behandeln.

Genauer: Die Reihenfolge zählt: spezifischere Exception-Typen müssen vor allgemeineren Typen stehen, sonst fängt ein früherer, breiterer catch-Block (z. B. Exception) alles ab und der speziellere danach wird nie erreicht — das meldet der Compiler als Fehler. Mit catch (IOException | SQLException e) lassen sich mehrere gleich behandelte Typen in einem Block zusammenfassen.

Im Detail

try {
    int[] zahlen = {1, 2, 3};
    int ergebnis = 10 / zahlen[5]; // wirft ArrayIndexOutOfBoundsException, nicht ArithmeticException
} catch (ArithmeticException e) {
    System.out.println("Rechenfehler: " + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("Ungültiger Index: " + e.getMessage());
} catch (Exception e) { // Auffangbecken für ALLES andere - muss zuletzt stehen
    System.out.println("Unerwarteter Fehler: " + e.getMessage());
}
 
// Kombinierter Multi-Catch (seit Java 7) - gleiche Behandlung für mehrere Typen
try {
    // ... Code, der IOException oder SQLException werfen kann
} catch (IOException | SQLException e) {
    System.out.println("Datei- oder Datenbankfehler: " + e.getMessage());
    // e hat hier effektiv den Typ "IOException oder SQLException" - nur gemeinsame Methoden nutzbar
}

Der Compiler erzwingt eine bestimmte Reihenfolge der catch-Blöcke: da ArithmeticException und ArrayIndexOutOfBoundsException beide Unterklassen von Exception sind, würde ein catch (Exception e) VOR den spezifischeren Blöcken alle Fehler abfangen und die spezifischeren Blöcke wären unerreichbarer, toter Code — Java meldet das deshalb als Compile-Fehler (“exception has already been caught”), nicht erst als Laufzeit-Überraschung. Der Multi-Catch (|) lohnt sich, wenn mehrere unabhängige Exception-Typen exakt gleich behandelt werden sollen — innerhalb des Blocks ist die Exception-Variable dann typmäßig auf die gemeinsame Schnittmenge der Methoden beider (oder mehrerer) Typen beschränkt.

Siehe auch: Exceptions, Error Codes