it-swarm.com.de

Kann ich mehrere Java Ausnahmen in derselben catch-Klausel abfangen?

In Java möchte ich Folgendes tun:

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}

...Anstatt von:

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

Gibt es eine Möglichkeit, dies zu tun?

648
froadie

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

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

Denken Sie jedoch daran, dass Sie diesen Basisausnahmetyp einfach abfangen können, wenn alle Ausnahmen zur selben Klassenhierarchie gehören.

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

Alternatives in a multi-catch statement cannot be related by subclassing
  Alternative ExceptionB is a subclass of alternative ExceptionA
1060
OscarRyz

Nicht genau vor Java 7, aber ich würde so etwas tun:

Java 6 und früher

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();
}
102
user454322

In Java 7 können Sie mehrere catch-Klauseln definieren, z.

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

Nein, eine pro Kunde.

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

try {
    // some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting Java.lang.Exception
    e.printStackTrace();
}

Dies ist jedoch möglicherweise nicht die beste Vorgehensweise. Sie sollten eine Ausnahme nur dann abfangen, wenn Sie eine Strategie für den tatsächlichen Umgang damit haben - und Protokollierung und erneutes Werfen bedeutet nicht "Umgang damit". Wenn Sie keine Korrekturmaßnahme haben, sollten Sie sie der Methodensignatur hinzufügen und sie an jemanden weiterleiten, der mit der Situation fertig wird.

15
duffymo

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

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

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

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

Mit dem obigen Code werden RepositoryException und PathNotFoundException für eine Art der Ausnahmebehandlung abgefangen, und alle anderen Ausnahmen werden zusammengefasst. Seit Java 7 laut der obigen Antwort von @ OscarRyz:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}
13
Michael Shopsin

Eine sauberere (aber weniger ausführliche und vielleicht nicht so bevorzugte) Alternative zu user454322s Antwort auf Java 6 (dh Android) wäre, alle Exceptions zu fangen und RuntimeExceptions erneut zu werfen . Dies würde nicht funktionieren, wenn Sie andere Arten von Ausnahmen weiter oben im Stapel abfangen möchten (es sei denn, Sie werfen sie ebenfalls erneut), aber effektiv alle angehakt Ausnahmen abfangen.

Zum Beispiel:

try {
    // CODE THAT THROWS EXCEPTION
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // this exception was not expected, so re-throw it
        throw e;
    } else {
        // YOUR CODE FOR ALL CHECKED EXCEPTIONS
    } 
}

Aus Gründen der Ausführlichkeit ist es jedoch möglicherweise am besten, einen Booleschen Wert oder eine andere Variable festzulegen und darauf basierend nach dem Try-Catch-Block Code auszuführen.

10
Oleg Vaskevich

Wie wäre es mit:

  Boolean   caught = true;
  Exception e;
  try {
     ...
     caught = false;
  } catch (TransformerException te) {
     e = te;
  } catch (SocketException se) {
     e = se;
  } catch (IOException ie) {
     e = ie;
  }
  if (caught) {
     someCode(); // You can reference Exception e here.
  }
3
Bill S

Fangen Sie die Ausnahme ab, die zufällig eine übergeordnete Klasse in der Ausnahme-Hierarchie ist. Dies ist natürlich eine schlechte Übung . In Ihrem Fall handelt es sich bei der gemeinsamen übergeordneten Ausnahme um die Exception-Klasse, und das Ermitteln einer Ausnahme, die eine Exception-Instanz ist, ist in der Tat eine schlechte Praxis. Ausnahmen wie NullPointerException sind normalerweise Programmierfehler und sollten normalerweise durch Überprüfen auf Nullwerte behoben werden.

0
Vineet Reynolds

Ja. Hier ist der Weg mit Pipe (|) Separator,

try
{
    .......
}    
catch
{
    catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
}
0
Shiva