824 Stimmen

Kann ich mehrere Java-Ausnahmen im selben catch-Block abfangen?

In Java möchte ich so etwas tun:

try {
    ...     
} catch (/* Code zum Fangen von IllegalArgumentException, SecurityException,
            IllegalAccessException und NoSuchFieldException zur gleichen Zeit */) {
   someCode();
}

...statt:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

Gibt es einen Weg, dies zu tun?

1305voto

OscarRyz Punkte 189898

Dies ist möglich seit Java 7. Die Syntax für einen Multi-Catch-Block ist:

try { 
  ...
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
            NoSuchFieldException e) { 
  someCode();
}

Denken Sie jedoch daran, dass Sie, wenn alle Ausnahmen zur gleichen Klassenhierarchie gehören, einfach diesen Basistyp der Ausnahme abfangen können.

Beachten Sie außerdem, dass Sie sowohl ExceptionA als auch ExceptionB im selben Block nicht abfangen können, wenn ExceptionB direkt oder indirekt von ExceptionA abgeleitet ist. Der Compiler wird sich beschweren:

Alternativen in einer Multi-Catch-Anweisung können nicht durch Vererbung verwandt sein
  Alternative ExceptionB ist eine Unterklasse der Alternative ExceptionA

Die Lösung dafür besteht darin, nur die Vorgängerausnahme in der Ausnahmeliste aufzunehmen, da sie auch Ausnahmen des Nachfolgertyps abfangen wird.

114voto

user454322 Punkte 6564

Nicht genau vor Java 7 aber, ich würde etwas wie das hier machen:

Java 6 und davor

try {
  //.....
} catch (Exception exc) {
  if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || 
     exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {

     someCode();

  } else if (exc instanceof RuntimeException) {
     throw (RuntimeException) exc;     

  } else {
    throw new RuntimeException(exc);
  }

}

Java 7

try {
  //.....
} catch ( IllegalArgumentException | SecurityException |
         IllegalAccessException |NoSuchFieldException exc) {
  someCode();
}

28voto

duffymo Punkte 298898

Nein, einer pro Kunde vor Java 7.

Sie können eine Superklasse, wie java.lang.Exception, abfangen, solange Sie in allen Fällen die gleiche Aktion ausführen.

try {
    // etwas Code
} catch(Exception e) { // Alle Ausnahmen werden hier abgefangen, da alle von java.lang.Exception erben
    e.printStackTrace();
}

Aber das ist vielleicht nicht die beste Praxis. Sie sollten eine Ausnahme nur abfangen, wenn Sie eine Strategie haben, um damit tatsächlich umzugehen - und protokollieren und neu werfen ist kein "Umgang damit". Wenn Sie keine Korrekturmaßnahme haben, ist es besser, sie zur Methodensignatur hinzuzufügen und sie an jemanden weiterzuleiten, der die Situation behandeln kann.

Mit JDK 7 und höher können Sie das tun:

try {
    ...     
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) {
    etwasCode();
}

26voto

crusam Punkte 6100

In Java 7 können Sie mehrere catch-Klauseln wie folgt definieren:

catch (IllegalArgumentException | SecurityException e)
{
    ...
}

21voto

Michael Shopsin Punkte 1955

Wenn es eine Hierarchie von Ausnahmen gibt, können Sie die Basisklasse verwenden, um alle Unterklassen von Ausnahmen zu erfassen. Im degenerierten Fall können Sie alle Java-Ausnahmen abfangen mit:

try {
   ...
} catch (Exception e) {
   someCode();
}

In einem häufigeren Fall, wenn RepositoryException die Basisklasse ist und PathNotFoundException eine abgeleitete Klasse ist, dann:

try {
   ...
} catch (RepositoryException re) {
   someCode();
} catch (Exception e) {
   someCode();
}

Der obige Code wird RepositoryException und PathNotFoundException für eine Art von Ausnahmebehandlung abfangen, alle anderen Ausnahmen werden zusammengefasst. Seit Java 7, wie in der Antwort von @OscarRyz oben:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X