Könnte eine endgültige Variable in catch neu zugewiesen werden, selbst wenn die Zuweisung die letzte Operation in try ist?

Davon bin ich hier ganz überzeugt

final int i;
try { i = calculateIndex(); }
catch (Exception e) { i = 1; }

i kann unmöglich schon vergeben worden sein, wenn die Kontrolle den catch-Block erreicht. Der Java-Compiler ist jedoch anderer Meinung und behauptet diesthe final local variable i may already have been assigned.

Fehlt mir hier noch etwas Subtilität oder ist dies nur eine Schwäche des Modells, das in der Java-Sprachspezifikation zur Identifizierung potenzieller Neuzuordnungen verwendet wird? Meine Hauptsorge sind Dinge wieThread.stop(), was dazu führen kann, dass eine Ausnahme "aus dem Nichts" geworfen wird, aber ich sehe immer noch nicht, wie sie nach der Zuweisung geworfen werden könnte, was anscheinend die allerletzte Aktion innerhalb des Try-Blocks ist.

Das obige Idiom würde, falls erlaubt, viele meiner Methoden vereinfachen. Beachten Sie, dass dieser Anwendungsfall eine erstklassige Unterstützung in Sprachen wie Scala bietet, die konsequent das verwendenKönnte sein Monade:

final int i = calculateIndex().getOrElse(1);

Ich denke, dieser Anwendungsfall ist eine gute Motivation, diesen einen Sonderfall zuzulasseni istdefinitiv nicht zugewiesen innerhalb des Catch-Blocks.

AKTUALISIEREN

Nach einigem Überlegen bin ich mir noch sicherer, dass dies nur eine Schwäche des JLS-Modells ist: Wenn ich das Axiom "im vorgestellten Beispiel deklariere,i ist definitiv nicht zugewiesen, wenn die Kontrolle den catch-Block erreicht ", widerspricht es keinem anderen Axiom oder Theorem. Der Compiler erlaubt kein Lesen voni bevor es im catch-block vergeben wird, also obi wurde zugewiesen oder kann nicht beobachtet werden.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage