Java Exception Catch Multiple

Also, stell dir vor, du sitzt im Café, Cappuccino in der Hand, und ich erzähle dir von Java Exceptions. Aber nicht so trocken, wie im Informatik-Unterricht, sondern mit 'ner Prise Humor und ner extra Portion "Hä, echt jetzt?"-Fakten. Wir reden heute über das Fangen mehrerer Ausnahmen – quasi das Multitasking der Fehlerbehandlung.
Stell dir vor, dein Programm ist wie ein tolpatschiger Kellner in einem überfüllten Restaurant. Er versucht, fünf Tabletts gleichzeitig zu jonglieren. Klar, da geht was schief. Vielleicht schmeißt er einen Teller Spaghetti Carbonara über den Schoß eines Gastes (IOException!), vielleicht stolpert er über eine herrenlose Katze und lässt die Champagnerflaschen fallen (NullPointerException!), oder er verwechselt Salz mit Zucker im Kaffee (IllegalArgumentException!).
Was ist das Problem?
Das Problem ist: Dein Programm (der Kellner) muss wissen, wie er mit all diesen potenziellen Katastrophen umgehen soll. Und hier kommt das "catch multiple" ins Spiel. Früher, in den guten alten Java-Zeiten (Java 6 und davor), musste man für jede Ausnahme einen eigenen catch-Block schreiben. Stell dir vor, der Kellner müsste für jeden kaputten Teller eine separate Entschuldigung vorbereiten. Ufff! Das war Code-Spaghetti Deluxe!
Must Read
Das sah dann ungefähr so aus (bitte nicht nachmachen, außer du stehst auf lange Code-Dateien):
try {
// Gefährlicher Code hier!
} catch (IOException e) {
// Spaghetti-Alarm!
System.err.println("Oh nein, eine Datei ist futsch!");
} catch (NullPointerException e) {
// Ups, da war wohl nix da!
System.err.println("NullPointerException! Da fehlt was!");
} catch (IllegalArgumentException e) {
// Falsche Zutat im Kaffee?
System.err.println("Das magische Wort ist 'IllegalArgument'!");
}
Die Rettung: Multi-Catch (ab Java 7)
Zum Glück haben die Java-Götter (oder die Entwickler von Java 7, ist ja fast dasselbe) ein Einsehen gehabt. Sie haben das Multi-Catch Feature erfunden! Jetzt kann unser Kellner mehrere ähnliche Fehler mit einer Entschuldigung abhandeln. Er kann einfach sagen: "Entschuldigung für alle Missgeschicke, die mit dem Umfallen von Essen zu tun haben!" (oder so ähnlich).

Der Code wird plötzlich viel eleganter:
try {
// Immer noch gefährlicher Code!
} catch (IOException | NullPointerException | IllegalArgumentException e) {
// Eine Entschuldigung für alle Fälle!
System.err.println("Irgendwas ist schiefgelaufen! Tut uns leid!");
}
Siehst du das magische |-Zeichen? Das ist der "Oder"-Operator für Exceptions! Es bedeutet: "Fang IOException oder NullPointerException oder IllegalArgumentException." Wie praktisch!

Wichtig: Du kannst nur Exceptions gemeinsam fangen, wenn sie keine Vererbungshierarchie haben. Du kannst also nicht Exception und IOException gemeinsam fangen, weil IOException von Exception erbt. Das wäre so, als würde man sagen: "Ich fange alle Lebewesen oder Katzen", obwohl Katzen ja schon Lebewesen sind. Das macht keinen Sinn, oder? (Außer vielleicht für einen Philosophenkater).
Wann Multi-Catch sinnvoll ist
Multi-Catch ist besonders dann nützlich, wenn:

Aber Achtung: Übertreib es nicht! Wenn du für jede Exception einfach nur e.printStackTrace() aufrufst, dann ist das vielleicht nicht die beste Lösung. Überlege dir, ob du die Exceptions nicht doch spezifischer behandeln solltest, um dem Benutzer (oder dir selbst, in Zukunft) bessere Informationen zu geben.
Ein überraschender Fakt
Wusstest du, dass es Leute gibt, die absichtlich Exceptions werfen? Ja, wirklich! Manchmal ist das der beste Weg, um einen Fehler zu signalisieren oder um eine bestimmte Logik im Programm zu steuern. Aber das ist eine andere Geschichte für einen anderen Cappuccino.
Also, das nächste Mal, wenn du in Java mehrere Exceptions fangen musst, denk an unseren tollpatschigen Kellner und das Multi-Catch Feature. Es wird dein Leben (und deinen Code) deutlich einfacher machen. Und jetzt, lass uns noch einen Cappuccino bestellen!
