Problème avec “étendues” de variables dans les blocs try catch en Java
Quelqu'un pourrait-il m'expliquer pourquoi, dans les dernières lignes, br n'est pas reconnu en tant que variable? J'ai même essayé en mettant br dans le try clause
, le définir comme final
, etc. Est ce que cela a quelque chose à voir avec Java supporte pas les bouchons? Je suis à 99% sûr de soi similaires code en C#.
private void loadCommands(String fileName) {
try {
final BufferedReader br = new BufferedReader(new FileReader(fileName));
while (br.ready()) {
actionList.add(CommandFactory.GetCommandFromText(this, br.readLine()));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) br.close(); //<-- This gives error. It doesn't
//know the br variable.
}
}
Grâce
- C# est un
using
mot-clé, comme une boucle for, vous permet de définir une variable limitée par le champ d'application. Java n'a pas que. - Btw: je ne ferais pas
e.printStackTrace()
ici. Votre programme devrait continuer à fonctionner avec éventuellement un vide de la liste des actions. Vous ne voulez pas que. Il suffit de jeter à travers et laissez votre la fermeture de l'application ou de décrochage avec un message d'erreur clair, de sorte que l'utilisateur final peut prendre des mesures en conséquence. - Je ne sais toujours pas comment suis-je censé traiter les Exceptions en Java. En C#, j'avais laisser passer ça dans la pile, mais si je veux le faire, je vais mettre une lance dans la déclaration de cette fonction, et une fonction qui appelle celui-ci. Ses un pain PITA.
Vous devez vous connecter pour publier un commentaire.
Parce qu'il est déclaré dans le bloc try. Les variables locales sont déclarées dans un bloc sont inaccessibles dans d'autres blocs, sauf si elles sont contenues en elle, c'est à dire, les variables hors de portée lors de leur bloc se termine. Ce faire:
De mettre à jour cette réponse depuis Java 7 & 8 release:
Tout d'abord, Si vous déclarez une variable à l'intérieur d'un traditionnel try{} bloc que vous n'avez pas accès à cette variable à l'extérieur de ce bloc try.
Maintenant depuis Java 7, vous pouvez créer un Try-With-Resources qui peut raccourcir votre code écrit, il supprime votre "champ d'application" problème et elle se ferme automatiquement les ressources pour vous!!! Un tour du Chapeau dans cette situation 😉
Le code équivalent avec Try-With-Resources est:
Avis que maintenant, vous n'avez même pas besoin de s'inquiéter à propos de la portée de la variable puisqu'il n'est pas besoin d'appeler .close() il est automatiquement fait pour vous!
Toute classe qui implémente l'AutoClosable interface peut être utilisée dans un Try-With-Resources bloc. Comme un exemple rapide, je vais laisser ça ici:
Si vous avez besoin de plus d'explication sur l'utilisation de try-with-resources cliquez sur ici
br est définie dans le bloc try il n'est donc pas dans le champ d'application dans le bloc finally.
Définir br à l'extérieur du bloc try.