Java fängt mehrere Ausnahmen ab

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 catchBlöcken aus, dh doppelten Code.

Die Assoziativität des Zuweisungsoperators =ist von rechts nach links, daher ArithmeticExceptionwird 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 catchBlock abfangen .

Jeder Ausnahmetyp, der vom catchBlock 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 catchBlock reduziert die Codeduplizierung und erhöht die Effizienz.

Der beim Kompilieren dieses Programms erzeugte Bytecode ist kleiner als das Programm mit mehreren catchBlöcken, da keine Code-Redundanz vorliegt.

Hinweis: Wenn ein catchBlock 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 catchBlock abgefangen werden, wird die Regel auf spezialisiert verallgemeinert.

Dies bedeutet, dass catchwir , 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 ExceptionKlasse sind. Anstatt also mehrere spezialisierte Ausnahmen abzufangen, können wir einfach die ExceptionKlasse abfangen .

Wenn die Basisausnahmeklasse bereits im catchBlock angegeben wurde, verwenden Sie keine untergeordneten Ausnahmeklassen im selben catchBlock. 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 ArithmeticExceptionund ArrayIndexOutOfBoundsExceptionbeide Unterklassen der ExceptionKlasse. Wir erhalten also einen Kompilierungsfehler.

Interessante Beiträge...