2014-11-10 13 views
5

Der folgende Code kompiliert ok, obwohl der try-Block tatsächlich keine Ausnahme auslöst.Java-Ausnahme try-catch Ausnahme vs IOException

Wenn der Catch jedoch durch eine Unterklasse von Exception ersetzt wird, wird der Code nicht kompiliert.

public static void main(String[] args) { 
    try {} 
    catch (IOException e) {} // won't compile. 
} 

Der Compiler Fehler ist: nicht erreichbar Fangblock für IOException. Diese Ausnahme wird niemals aus dem Körper der try-Anweisung ausgelöst.

Wie kommt dieses Verhalten, wenn beide Ausnahmen & IOException sind Ausnahmen überprüft? Ich bin mit Java 7.

+0

'RuntimeException's sind auch' Exceptions', also sind nicht alle Exceptions geprüft. –

Antwort

6

Der Compiler kann genau wissen, was Teil des Codes kann eine IOException werfen, weil es eine Ausnahme geprüft ist, so dass jedes Verfahren, das diese Art von Ausnahme auslösen kann, muss es in der Methode angeben Unterschrift.

Auf der anderen Seite, Laufzeit oder ungeprüfte Ausnahmen nicht erwartet werden sollen, und da RuntimeException (die Elternklasse von ungeprüften Ausnahmen) auch die Klasse erweitert Exception, dann mit ihm dem Compiler ist in Ordnung.

3

Exception hat Unterklassen, die nicht markiert sind Ausnahmen (RuntimeExceptionException erstreckt). Throwable wird sich ähnlich verhalten. RuntimeException oder Unterklassen von RuntimeException werden sich ähnlich verhalten. Unterklassen von Exception andere als RuntimeException werden nicht.

3

Manouti Antwort scheint richtig, aber nach der Java-Dokumentation:

Es ist ein Fehler bei der Kompilierung, wenn eine catch-Klausel Fänge Ausnahmetyp E1 geprüft, aber es gibt keine geprüfte Ausnahme E2, so daß alle das gilt:

< E2: E1 try-Block zu dem Fang Klausel entsprechen E2 kein vorausFangBlock der unmittelbar einschließe try-Anweisung Rasten E2 oder einen übergeordneten Typs von E2 werfen kann. , außer E1 ist die Klasse Exception.

Es ist ein expliziter Fall für das Werfen einer Exception Instanz (die Exception Klasse außergewöhnlich ist, könnte man sagen).Dies ist die Java 5 Dokumentation, aber es sei denn, jemand anders sieht, ich bezweifle stark, dies seit

Mit Blick auf die Vererbungsbaum für Exception und IOException

https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html

und

https://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true

geändert hat

in Java 7, sehe ich nicht, dass die Diskussion über Checked/Unchecked Ausnahmen direkt relevant ist - während es stimmt, dass deaktivieren ed Ausnahmen die gleichen Regeln nicht befolgen, müssen nicht markiert Ausnahmen von RuntimeException erben, was Exception natürlich nicht (es ist die Mutter dieser Klasse)

https://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#308526

(wieder, Java 5 docs, aber es hat sich nicht geändert) https://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html