2013-06-06 5 views
15

Ich bin Überprüfung die neuen Funktionen von Java SE7 und ich bin zur Zeit an dieser Stelle:Java catch-Block, gefangen Ausnahme ist nicht endgültig

http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html

in Bezug auf die mehrfache Funktion zu fangen, wenn ich über diese kam Anweisung:

Hinweis: Wenn ein catch-Block mehr als einen Ausnahmetyp behandelt, ist der Catch-Parameter implizit endgültig. In diesem Beispiel ist der Parameter catch final und kann daher innerhalb des catch-Blocks keine Werte zuweisen.

Ich habe nie bemerkt, dass die gefangene Ausnahme im klassischen Fall von handling gefangener Ausnahmen nicht endgültig ist.

Ich frage mich nur, warum ist das überhaupt eine gute Sache? Wäre es nicht unklug, eine abgefangene Ausnahme zu ÄNDERN, bevor ich sie neu aufnehme oder vielleicht ihre Nachricht protokolliere? Sollte es nicht der Trowing-Mechanismus sein, um die Ausnahme zu erstellen, so stellt es genau das dar, was es sollte?

Ich habe noch nie eine Ausnahme gesehen, die im Catch-Block geändert wurde, kann vielleicht jemand darauf hinweisen, dass es Vorteile hat?

Danke!

+0

Uh, gut, ich wusste nicht einmal, dass es im "single exception" -Fall nicht final war ... – fge

+0

Was wäre der Unterschied, wenn es endgültig wäre, da nur der catch-Block von diesem Objekt weiß? Spielt es eine Rolle, ob du dieses oder ein anderes Objekt wieder in Angriff nimmst? in den meisten Fällen die Ausnahme, wenn sie in eine andere eingepackt und erneut aufgetaut wird. Wenn es endgültig war, könnte man eine modifizierte Kopie noch einmal nachholen. –

+0

Der einzige Grund, an den ich denken konnte, ist, wenn Sie aus irgendeinem Grund mit der Methode setStackTrace() für die Ausnahme die Stack-Ablaufverfolgung bearbeiten oder hinzufügen möchten. – MasNotsram

Antwort

4

Es ist so ziemlich das gleiche wie Methodenargumente:

Sie in der Regel nicht ändern sie und viele Menschen stimmen darin überein, dass sie als final behandelt werden sollten (auch nicht wirklich final zu schreiben vor Sie sind Gegenstand einer Debatte).

Aber da es keine technische Anforderung gibt, die besagt, dass es final sein muss, gibt Ihnen die Sprache die Möglichkeit zu wählen.

Persönlich kenne ich keinen guten Grund, den Ausnahmeverweis eines Catch-Blocks zu ändern.

+0

Ziemlich interessanter Punkt! Ich denke, es macht Sinn, aber immer noch fühle ich mich, dass dieser Fall ein bisschen speziell ist. Ich für meinen Teil würde modifizieren und Ausnahmen in irgendeiner Weise, nachdem es eine schlechte Praxis gefangen ist. Vielen Dank für Ihre Aufmerksamkeit! –

+0

@ user1960804: Denken Sie daran, dass "das Modifizieren der Ausnahme" (über einige Methodenaufrufe) und die * Referenz *, die "final" sind, orthogonal sind (eine davon beeinflusst nicht die andere)! –

+0

Ja, ich weiß, ich muss sagen, ich fühle mich immer noch genauso, wenn ich das in Betracht ziehe. Es ist mehr wie das endgültige Keyword zu diesem Zeitpunkt. –

0

Der Grund, warum ich daran denken kann, es endgültig durchzusetzen, liegt an der Leistung. Sobald die Fangbewertung beginnt, gewährleistet ein endgültiger unveränderlicher Wert in der Mechanik der Auswertung eine schnellere Auswertung aller Fänge. Da try-catch häufig in jedem Java-Code verwendet wird, ist das Design mit der höchsten Leistung vorzuziehen.

Basierend auf den oben genannten, bedeutet es eine Leistungsverbesserung, die die meisten Programme betrifft.

+0

Ich habe nicht darüber nachgedacht, ich frage mich, was andere Leute dazu sagen? –

+2

Ich glaube nicht, dass es leistungsmäßig einen Unterschied machen würde. Der JIT-Compiler ist perfekt in der Lage, herauszufinden, ob sich eine lokale Variable nach ihrer anfänglichen Zuweisung ändert ... und auf dieser Basis zu optimieren. Es braucht keinen * letzten Hinweis, weder implizit noch explizit. –

+0

Ich muss diesem Punkt zustimmen –

3

Ich kann mir keinen überzeugenden Anwendungsfall vorstellen, um eine Ausnahme in einer klassischen catch-Klausel zu modifizieren. Dies bedeutet jedoch nicht, dass es verboten sein sollte. Vor allem, da Sie eine Parametervariable ändern können. Wenn Sie diese Bedenken haben, können Sie die Ausnahmevariable als final deklarieren.

Auf der anderen Seite, um Änderungen in der Mehr Ausnahme fangen würde die Möglichkeit, wirklich bizarr und verwirrend Code wie dies führt:

catch (IOException | NullPointerException ex) { 
     ... 
     ex = new IllegalArgumentException(...); 
    } 

Ich stelle mir das ist, was die Designer im Sinn hatte, als sie hinzugefügt die Beschränkung in diesem Fall.

Aber so oder so, das ist, wie die Java-Sprache definiert ist und womit wir leben müssen. Es macht keinen großen Sinn, die offensichtlichen Inkonsistenzen zu diskutieren ... es sei denn, Sie beabsichtigen, eine neue Sprache zu entwerfen und zu implementieren.

+0

Kein Zweifel, aber das Verständnis der Sprache bringt immer alle näher, um den besten Code zu entwickeln. Ich stellte die Frage tatsächlich, um herauszufinden, ob es einen brauchbaren Grund für jemanden gibt, die Referenz selbst zu ändern. Ich werde in nächster Zeit keine neue Sprache implementieren. :/Danke für Ihre Aufmerksamkeit! –

+0

Ist Catch (IOException | NullPointerException ex) neue Syntax in Java 7? – selig

+0

Ja! Sie können alles über den Link lesen, den ich in der Frage hinzugefügt habe. http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html –

0

Die Idee hinter der ausnahmebasierten Fehlerbehandlung ist, dass jeder Fehler, wenn überhaupt möglich, auf der entsprechenden Abstraktionsebene wiederhergestellt werden sollte. Eine solche Fehlerkorrektur erfordert möglicherweise Informationen, die nicht direkt verfügbar sind, wenn die Ausnahme tatsächlich behandelt wird. Aus diesem Grund kann es nützlich sein, die Ausnahme abzufangen, sie mit den relevanten Informationen zu ergänzen und sie erneut auszulösen oder sie möglicherweise als Ursache für ein neues Ausnahmeobjekt einer geeigneteren Klasse festzulegen.

Verwandte Themen