Final affectation de variable avec try/catch
Parce que je crois que c'est une bonne programmation pratique, je fais toutes mes (local ou une instance) variables final
s'ils sont destinés à être gravés qu'une seule fois.
Cependant, j'ai remarqué que lorsque une affectation de variable peut lever une exception, vous ne pouvez pas prendre cette variable final:
final int x;
try {
x = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
x = 42; //Compiler error: The final local variable x may already have been assigned
}
Est-il un moyen de le faire sans avoir recours à une variable temporaire? (ou n'est-ce pas le bon endroit pour un modificateur final?)
- Je doute que vous pouvez faire sans une variable temporaire.
final int x = makeX();
certainement. (try-catch dans la fonction)- Choquant que le JDK n'ai toujours pas de
tryParse
. - définitivement, mais il n'est pas pertinent dans ce cas depuis que j'ai juste utilisé le entier comme un exemple
- J'ai pensé.
- Pour être parfaitement clair, l'erreur de compilation est incorrect, n'est-il pas? Il n'y a aucune circonstance dans laquelle x peut être attribué à deux reprises dans l'exemple donné.
- c'est beaucoup demander pour le compilateur pour obtenir qu'en général, lorsqu'il y a plusieurs lignes dans le bloc try où l'exception qui pourrait arriver. Il serait agréable d'avoir un cas exceptionnel pour cette fin, bien que, détection lorsque la cession est la dernière instruction dans l'essai.
- Je pense que le vrai problème, c'est que Java est
try
-catch
déclaration ne prend pas en charge unelse
cas comme le Python.
Vous devez vous connecter pour publier un commentaire.
Une façon de le faire est par l'introduction d'une (non-
final
) variable temporaire, mais vous avez dit que vous ne vouliez pas le faire.Une autre façon est de déplacer les deux branches du code dans une fonction:
De savoir si ou non de cette pratique dépend de l'utilisation exacte de cas.
Dans l'ensemble, aussi longtemps que
x
est une conséquence d'une étendue variable locale, le plus pratique générale de l'approche pourrait être de laisser les non-final
.Si, d'autre part,
x
est une variable membre, mon conseil serait d'utiliser un non-final
temporaire lors de l'initialisation:this.x
est une primitiveboolean
, comme c'est la variable locale. Même avec Java 9, nous obtenons "<thing_in_the_role_of_x_val
> ne peut pas avoir été initialisé". Le manque de contrôle de flux de l'analyse de cette situation est frustrante, mais facilement contourné.Non ce n'est pas le bon endroit, imaginez que vous avez obtenu plus de 1 Instruction dans votre try et catch block, le premier dit : x = 42. Après quelques autres États du bloc de l'essai échoue, et il va le bloc catch, où votre de Dire x = 30. Maintenant que vous avez défini x deux fois.