Le "problème" vous faites le lien semble décrire cette situation:
SomeObject so;
try {
// Do some work here ...
so = new SomeObject();
so.DoUsefulThings();
} finally {
so.CleanUp(); // Compiler error here
}
L'auteur de la plainte, c'est que le compilateur renâcle à la ligne dans l' finally
section, affirmant qu' so
peut être initialisée. Le commentaire puis mentionne une autre manière d'écrire le code, probablement quelque chose comme ceci:
// Do some work here ...
SomeObject so = new SomeObject();
try {
so.DoUsefulThings();
} finally {
so.CleanUp();
}
L'auteur n'est pas satisfait de cette solution, car le compilateur dit alors que le code "doit être à l'intérieur de l'essayer." Je suppose que cela signifie que le code peut lever une exception qui n'est pas traité plus. Je ne suis pas sûr. Ni la version de mon code gère toutes les exceptions, de sorte que rien de l'exception liée à la première version devrait fonctionner de la même dans le second.
De toute façon, cette deuxième version du code est correct façon de l'écrire. Dans la première version, le compilateur du message d'erreur était correcte. L' so
variable peut être initialisée. En particulier, si l' SomeObject
constructeur échoue, so
ne sera pas initialisé, et si c'est une erreur de tentative d'appel d' so.CleanUp
. Saisissez toujours l' try
section après avoir acquis la ressource que l' finally
section finalise.
L' try
-finally
bloc après l' so
d'initialisation est là uniquement pour protéger l' SomeObject
exemple, pour faire en sorte qu'il soit nettoyé n'importe quoi d'autre qui se passe. Si il y a d'autres choses qui ont besoin de courir, mais ils ne sont pas si l' SomeObject
instance de la propriété attribués, alors qu'ils devraient aller dans un autre try
-finally
bloc, sans doute l'un qui encapsule celui que j'ai montré.
Nécessitant des variables à être attribuées manuellement avant l'utilisation ne conduisent pas à des problèmes réels. Il ne conduit qu'à un mineur de soucis, mais votre code sera mieux pour elle. Vous aurez variables de portée plus limitée, et try
-finally
blocs qui ne cherchent pas à protéger de trop.
Si les variables locales avaient des valeurs par défaut, puis so
dans le premier exemple aurait été null
. Qui ne s'est pas vraiment résolu quoi que ce soit. Au lieu d'obtenir une erreur de compilation dans l' finally
bloc, vous avez une NullPointerException
tapi là-bas qui pourrait cacher quelque autre exception peut se produire dans le "Faire un peu de travail ici" l'article du code. (Ou faire des exceptions en finally
sections automatiquement de la chaîne à l'exception antérieure? Je ne me souviens pas. De même, vous auriez un extra exception dans le chemin du vrai.)