2015-02-18 8 views
7

Die zu Java 7 hinzugefügte Oracle-Dokumentation zu multi-catch feature besagt, dass der Ausnahmeparameter in der catch-Klausel implizit final ist.Warum benötigt die Mehrfachfangfunktion in Java Ausnahmen, um endgültig zu sein?

Meine Frage ist: Was ist der Sinn einer solchen Einschränkung? Weil ich nicht eine einzige entscheidende Verbesserung finden kann, die es bringt. Das Markieren eines Referenzobjekts als final schützt nur die Referenz selbst vor einer Änderung, nicht das Objekt, auf das sie verweist, und es ist niemals verboten, eine weitere Referenz zu erstellen und sie auf die von ihnen gewünschte Weise zu modifizieren.

A somewhat relevant question on SO diskutiert die Gründe, warum in einer catch Klausel die Ausnahme Bezug zu modifizieren ist nicht das Klügste, was zu tun, aber es bezieht sich auf jede Verwendung der catch Klausel, nicht nur die Mehrfang Form davon. Warum macht Java also eine Ausnahme für den Multi-Catch und behandelt sie auf besondere Weise?

Danke!

+0

Nicht viel können Sie normalerweise einer Variablen mit einem Typ Union zuweisen. –

+0

Ich vermute es hat damit zu tun, dass der Typ im Multi-Catch nicht klar ist. – Mnementh

+1

[This] (http://stackoverflow.com/a/16960774/438154) Antwort in der Frage, die Sie verknüpft haben, gibt eine Erklärung. –

Antwort

10

In der uni-catch-Klausel können Sie das Ausnahmeobjekt erneut zuweisen. Zum Beispiel funktioniert das gut:

try { 
    ... // code that can throw IOException or some user-defined ParserException 
} catch(IOException) { 
    e = new IOException(); // this is acceptable (although there is no point in doing it) 
    e.printStackTrace(); 
} 

Der Compiler weiß sicher, dass das geworfene Objekt vom Typ IOException. jedoch in der Klausel Multi-Fang, Sie so etwas wie haben:

try { 
    ... // code that can throw IOException or some user-defined ParserException 
} catch(IOException | ParserException e) { 
    e = new IOException(); // this is NOT acceptable -- e may reference a ParserException 
    e.printStackTrace(); 
} 

In diesem Fall hat der Compiler keine Ahnung, welche Art die Ausnahme zur Compile-Zeit ist, so eine neue IOException einer Variablen zugewiesen Das kann entweder ein IOException oder ParseException sollte nicht zulässig sein. Hinzu kommt das Fehlen von Use-Cases für die Zuweisung an die Exception-Variable an erster Stelle. Daher macht es durchaus Sinn, die Variable implizit final zu machen und all diese Verwirrung zu vermeiden. Wenn Sie der Variablen wirklich zuweisen müssen, können Sie auf die alte Schreibweise von catch Bausteinen umschalten.