In Java 7 wurde der catch-Block verbessert, um mehrere Ausnahmen in einem einzigen catch-Block zu behandeln. Wenn Sie mehrere Ausnahmen abfangen und sie einen ähnlichen Code haben, wird durch Verwendung dieses Features die Code-Duplizierung reduziert. Lassen Sie uns das Feature zum Abfangen mehrerer Java-Ausnahmen anhand eines Beispiels verstehen.
Java mehrere Ausnahmen abfangen
Vor Java 7 haben wir mehrere Ausnahmen einzeln abgefangen, wie unten gezeigt.
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
In Java 7 können wir beide Ausnahmen in einem einzigen catch-Block abfangen, wie folgt:
catch(IOException | SQLException ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
Wenn ein catch-Block mehrere Ausnahmen behandelt, können Sie sie mit einem Pipe-Zeichen (|) trennen, und in diesem Fall ist der Ausnahme-Parameter (ex) final, sodass Sie ihn nicht ändern können. Der Bytecode, der durch dieses Feature generiert wird, ist kleiner und reduziert die Code-Redundanz.
Java Ausnahme erneut werfen
Eine weitere Verbesserung wurde bei der Compiler-Analyse von erneut geworfenen Ausnahmen vorgenommen. Mit Java Ausnahme erneut werfen können Sie spezifischere Ausnahmetypen in der throws-Klausel einer Methodendeklaration angeben. Lassen Sie uns dies anhand eines kleinen Beispiels sehen:
package com.journaldev.util;
public class Java7MultipleExceptions {
public static void main(String[] args) {
try{
rethrow("abc");
}catch(FirstException | SecondException | ThirdException e){
// Die unten stehende Zuweisung wird eine Kompilierzeit-Ausnahme auslösen, da e final ist
//e = new Exception();
System.out.println(e.getMessage());
}
}
static void rethrow(String s) throws FirstException, SecondException,
ThirdException {
try {
if (s.equals("First"))
throw new FirstException("First");
else if (s.equals("Second"))
throw new SecondException("Second");
else
throw new ThirdException("Third");
} catch (Exception e) {
// Die folgende Zuweisung deaktiviert das verbesserte Rethrow-Ausnahmeprüffeature von Java 7
// e=new ThirdException();
throw e;
}
}
static class FirstException extends Exception {
public FirstException(String msg) {
super(msg);
}
}
static class SecondException extends Exception {
public SecondException(String msg) {
super(msg);
}
}
static class ThirdException extends Exception {
public ThirdException(String msg) {
super(msg);
}
}
}
Wie Sie sehen können, fängt der Catch-Block in der Methode rethrow
eine Ausnahme ab, die jedoch nicht Bestandteil der throws-Klausel ist. Der Java 7 Compiler analysiert den vollständigen Try-Block, um zu überprüfen, welche Arten von Ausnahmen ausgelöst und dann aus dem Catch-Block erneut geworfen werden. Beachten Sie, dass diese Analyse deaktiviert wird, wenn Sie das Argument des Catch-Blocks ändern. Weitere Informationen: Exception Handling in Java.
Source:
https://www.digitalocean.com/community/tutorials/java-catch-multiple-exceptions-rethrow-exception