In einer Java-7 multicatch-block, was ist der Typ der Ausnahme gefangen?
In einer Java-7 multicatch block wie die folgenden:
try {
//code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
//handle exception
}
was ist der compile-Zeit-Typ von ex
? Ist es die am meisten abgeleitete Klasse, die beiden Ausnahme-Typen gemeinsam? In diesem Beispiel wäre das eine IOException
.
- würde es Sinn machen, werden jeweils geworfen, aber Sie können leicht überprüfen, indem Sie drucken aus
ex.getClass()
- Wenn Sie brauchen, um das unterschiedliche Verhalten basiert auf dem, was die Ausnahme gefangen ist, dann sollte man sich nicht mit einem multicatch-block - brechen Sie aus in mehrere catch-Blöcke.
- ist eine compile-time-Konzept, Sie reden von der Laufzeit-Klasse des Objekts.
- Ich würde gerne wissen, compile-Zeit-Typ von
ex
, nicht der Typ zur Laufzeit. - Ich will nicht anders Verhalten; ich würde nur gerne wissen, der Typ der Ausnahme.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, die Art der
ex
ist die spezifische Supertyp der beidenCharacterCodingException
undUnknownServiceException
, das wäreIOException
.Edit: Direkt aus des Pferdes Mund auf http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Dokumentation-v0.83.html#multi_catch:
lub
Berechnung definition ist hier: docs.oracle.com/javase/specs/jls/se7/html/...In JSL 7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20-510
§14.20 > Der deklarierte Typ der exception-parameter, bezeichnet seine Art als eine union mit
alternativen zu D1 | D2 | ... | Dn lub(D1, D2, ..., Dn) (§15.12.2.7).
Die definition von
lub()
d.h. die kleinste Obere Schranke ist ziemlich verworren. Glücklicherweise Typen, die wir hier sprechen, sind in der Regel einfach nicht generischen Unterklassen von Throwable, undlub()
liefert die spezifische super-Klasse.Für einen komplizierteren Fall betrachten