Je suis assez convaincu qu'ici
final int i;
try { i = calculateIndex(); }
catch (Exception e) { i = 1; }
i
ne peuvent avoir déjà été attribué si le contrôle atteint la catch-bloc. Cependant, le compilateur Java n'est pas d'accord et les revendications the final local variable i may already have been assigned
.
Y a t il une subtilité qui m'échappe ici, ou est-ce juste une faiblesse du modèle utilisé par le Langage Java Spécification pour identifier les éventuelles réaffectations? Mon principal souci des choses comme Thread.stop()
, ce qui peut entraîner une exception levée "hors de l'air mince, mais je ne vois pas comment il peut être levée après l'affectation, qui est apparemment la dernière action au sein de l'essayer à bloc.
L'expression ci-dessus, si c'est permis, ferait beaucoup de mes méthodes plus simples. Notez que ce cas d'utilisation a soutien de première classe dans les langues, comme la Scala, employer systématiquement le Peut-être monade:
final int i = calculateIndex().getOrElse(1);
Je pense que ce cas d'utilisation sert une très bonne motivation pour permettre qu'un cas spécial où l' i
est certainement pas assignée à l'intérieur de la catch-bloc.
Mise à JOUR
Après réflexion, je suis même plus certain que ce n'est qu'une faiblesse de la JLS modèle: si je déclare l'axiome "dans l'exemple présenté, i
est certainement non assigné lorsque le contrôle atteint la catch-bloc", il ne sera pas en conflit avec un autre axiome ou un théorème. Le compilateur ne permet pas une lecture de i
avant il est affecté dans le fourre-bloc, de sorte que le fait qu' i
a été attribuée ou non ne peut être observée.