English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In this tutorial, we will learn how to handle multiple exceptions in Java with examples.
In Java 7Zuvor mussten wir, selbst wenn es Code-Redundanz gab, mehrere Ausnahmebehandlungscode für verschiedene Arten von Ausnahmen schreiben.
Lassen Sie uns ein Beispiel nennen.
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()); } } }
Ausgaberesultat
/ von zero
In diesem Beispiel könnten zwei Ausnahmen auftreten:
ArithmeticException - weil wir versucht haben, eine Zahl durch 0 zu teilen.
ArrayIndexOutOfBoundsException - da wir bereits eine neue Ganzzahlarray deklariert haben, das Arraylimit von 0 bis9und wir versuchen, den Index10einer Wert zugewiesen.
Wir drucken in beiden catch-Blöcken die Ausnahmemeldung aus, was wiederholten Code bedeutet.
Das Verknüpfungsoperator (=) hat eine Assoziativität von rechts nach links, daher wird ArithmeticException zunächst mit der Nachricht / von zero aus geworfen.
In Java SE 7In Versionen und höher, können wir jetzt mehrere Arten von Ausnahmen in einem einzigen catch-Block fangen.
Jede Ausnahmeart, die von einem catch-Block behandelt werden kann, wird durch einen vertikalen Strich (|) getrennt.
Die Syntax ist:
try { // Code } catch (ExceptionType1 | Ausnahmeart2 ex) { // 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()); } } }
Ausgaberesultat
/ von zero
Das Fangen mehrerer Ausnahmen in einem einzigen catch-Block kann die Kodierredundanz verringern und die Effizienz erhöhen.
Der Bytecode, der beim Kompilieren des Programms generiert wird, ist kleiner als der eines Programms mit mehreren catch-Blöcken, da es keine Code-Redundanz gibt.
Hinweis:Wenn ein catch-Block mehrere Ausnahmen behandelt, ist der catch-Parameter implizit final. Das bedeutet, dass wir keine Werte zu dem Parameter zuweisen können.
Wenn mehrere Ausnahmen in einem einzelnen catch-Block gefangen werden, wird diese Regel auf die Spezialisierungsregel generalisiert.
Das bedeutet, wenn es eine Ausnahmehierarchie im catch-Block gibt, können wir nur grundlegende Ausnahmen fangen und nicht mehrere spezifische Ausnahmen fangen.
Lassen Sie uns ein Beispiel nennen.
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()); } } }
Ausgaberesultat
/ von zero
Wir wissen, dass alle Ausnahmearten Unterklassen der Exception-Klasse sind. Daher müssen wir nicht mehrere spezifische Ausnahmen fangen, sondern nur die Exception-Klasse fangen.
Wenn Sie bereits eine grundlegende Ausnahmeart in einem catch-Block angegeben haben, verwenden Sie keine Unterexceptionart in diesem catch-Block. Andernfalls erhalten wir einen Compilerfehler.
Lassen Sie uns ein Beispiel nennen.
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()); } } }
Ausgaberesultat
Main.java:6: Fehler: Alternativen in einem mehrfachen-catch-Anweisung kann nicht durch Vererbung verbunden werden
In diesem Beispiel sind ArithmeticException und ArrayIndexOutOfBoundsException beide Subklassen der Exception-Klasse. Daher werfen wir einen Kompilierungsfehler aus.