In diesem Tutorial lernen wir anhand von Beispielen, wie Sie mit mehreren Ausnahmen in Java umgehen können.
Vor Java 7 mussten wir mehrere Ausnahmebehandlungscodes für verschiedene Arten von Ausnahmen schreiben, selbst wenn Code-Redundanz bestand.
Nehmen wir ein Beispiel.
Beispiel 1: Mehrere Fangblö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
/ um Null
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, Index 10 einen Wert zuzuweisen.
Wir drucken die Ausnahmemeldung in beiden catch
Blöcken aus, dh doppelten Code.
Die Assoziativität des Zuweisungsoperators =
ist von rechts nach links, daher ArithmeticException
wird zuerst mit der Nachricht / um Null geworfen.
Behandeln Sie mehrere Ausnahmen in einem Catch-Block
In Java SE 7 und höher können wir jetzt mehr als einen Ausnahmetyp in einem einzelnen catch
Block abfangen .
Jeder Ausnahmetyp, der vom catch
Block behandelt werden kann, wird durch eine vertikale Leiste oder Pipe getrennt |
.
Die Syntax lautet:
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
/ um Null
Das Abfangen mehrerer Ausnahmen in einem einzelnen catch
Block reduziert die Codeduplizierung und erhöht die Effizienz.
Der beim Kompilieren dieses Programms erzeugte Bytecode ist kleiner als das Programm mit mehreren catch
Blöcken, da keine Code-Redundanz vorliegt.
Hinweis: Wenn ein catch
Block mehrere Ausnahmen behandelt, ist der catch-Parameter implizit final
. Dies bedeutet, dass wir keine Werte zuweisen können, um Parameter abzufangen.
Fangbasis Ausnahme
Wenn mehrere Ausnahmen in einem einzelnen catch
Block abgefangen werden, wird die Regel auf spezialisiert verallgemeinert.
Dies bedeutet, dass catch
wir , wenn der Block eine Hierarchie von Ausnahmen enthält, nur die Basisausnahme abfangen können, anstatt mehrere spezialisierte Ausnahmen abzufangen.
Nehmen wir ein Beispiel.
Beispiel 3: Nur Basisausnahmeklasse 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
/ um Null
Wir wissen, dass alle Ausnahmeklassen Unterklassen der Exception
Klasse sind. Anstatt also mehrere spezialisierte Ausnahmen abzufangen, können wir einfach die Exception
Klasse abfangen .
Wenn die Basisausnahmeklasse bereits im catch
Block angegeben wurde, verwenden Sie keine untergeordneten Ausnahmeklassen im selben catch
Block. Andernfalls wird ein Kompilierungsfehler angezeigt.
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: Fehler: Alternativen in einer Multi-Catch-Anweisung können nicht durch Unterklassen verknüpft werden
In diesem Beispiel sind ArithmeticException
und ArrayIndexOutOfBoundsException
beide Unterklassen der Exception
Klasse. Wir erhalten also einen Kompilierungsfehler.