Comment puis-je fermer un fichier après l'interception d'une IOException en java?
Tous,
Je suis en train de vous assurer qu'un fichier que j'ai ouvert avec BufferedReader est fermé quand je attraper une IOException, mais il semble comme si mon BufferedReader objet qui est hors de portée dans le bloc catch.
public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
fileArrayList.removeAll(fileArrayList);
try {
//open the file for reading
BufferedReader fileIn = new BufferedReader(new FileReader(fileName));
//add line by line to array list, until end of file is reached
//when buffered reader returns null (todo).
while(true){
fileArrayList.add(fileIn.readLine());
}
}catch(IOException e){
fileArrayList.removeAll(fileArrayList);
fileIn.close();
return fileArrayList; //returned empty. Dealt with in calling code.
}
}
Netbeans se plaint qu'il ne peut pas trouver le symbole fileIn" dans le bloc catch, mais je veux m'assurer que, dans le cas d'une IOException que le Lecteur ait fermé. Comment puis-je le faire sans la laideur d'un deuxième try/catch autour de la première?
Des conseils ou des indications sur les meilleures pratiques dans cette situation est appréciée,
OriginalL'auteur DimDom | 2010-04-15
Vous devez vous connecter pour publier un commentaire.
Peu de choses sur le code ci-dessus:
finally
. Étonnamment beaucoup de réponses de ne pas mentionner à ce sujet. Voici un peu de Soleil aux liens d'intérêt: Leçon de Base: IO et Leçon: les ExceptionsVous pouvez désactiver la case pour
null
et attraperException
, sauf si vous envisagez d'en informer l'utilisateur que vous ne pouvait pas fermer le fichier de rapport ne pouvais pas l'ouvrir. Mais, généralement, les utilisateurs ne se soucient pas.Vous avez fermé la BufferdedRead, mais pas le FileReader?
La fermeture de la BufferedReader fermera automatiquement la FileReader.
En effet, la Java IO classes suit le pattern décorateur. Il en sera de sous chaque
close()
délégué à la hausse de la décorées instance.OriginalL'auteur Yishai
Une fois que vous frappez le bloc catch, toutes les variables déclarées dans le try ne sont pas étendue plus. Déclarer BufferedReader fileIn = null; au-dessus du bloc try, puis d'attribuer à l'intérieur. Dans votre bloc catch, faire si(fileIn != null) fileIn.close();
OriginalL'auteur purecharger
Il se plaint de la symbole n'étant pas là, car il n'est pas. C'est dans le bloc try. Si vous voulez faire référence à fileIn, vous aurez besoin de la déclarer en dehors de l'essayer.
Cependant, il sonne vraiment comme vous voulez placer le fermer dans un bloc finally plutôt: vous devez fermer le fichier indépendamment de la réussite ou de l'échec avant de revenir.
OriginalL'auteur Yuliy
Mon préféré façon de faire du nettoyage après qu'une exception (lorsque le nettoyage peut être lever une exception) est de mettre le code dans le bloc try à l'intérieur d'un autre try/finally bloc, comme suit:
OriginalL'auteur DaveJohnston
Déplacer la déclaration du bloc try:
Mais, vous aurez toujours besoin de faire attention à ce que
fileIn
a effectivement été initialisé avant d'essayer de le fermer:NullPointerException
. Vérifier lanull
dans lecatch
.Dans vos prises, vous avez
fileIn.close();
qui jette également une IOException. Le compilateur ne le permettrait pas.OriginalL'auteur Kaleb Pederson
Déclarer la BufferedReader en dehors du bloc try et mis à null alors utiliser un bloc finally pour la fermer si elle n'est pas nulle.
Aussi fileArrayList est passé par référence afin que toutes les modifications apportées à ce qui va arriver à l'objet que vous avez passé donc il n'y a pas lieu de la renvoyer.
OriginalL'auteur John ClearZ
Il est préférable de ne pas traiter avec
null
- le général idiome pour l'acquisition de ressources et de la libération en Java :donc:
Voir mes points ici
Si vous utilisez un lecteur, vous doit spécifier l'encodage comme je le fais ici. Si vous voulez lire des octets oublier le lecteur. Aussi, si vous utilisez
readLine()
vous devez oublier les caractères de fin de ligne - si c'est un souci de considérer l'omission de laBufferedReader
entièrement.IOException
jeté par un fichier-fermer l'opération qui est lui-même à l'intérieur d'unCatch(IOException e)
, mais si lefinally
est atteint par l'intermédiaire de la normale de l'exécution du code, à avaler uneIOException
proches pourrait entraîner l'appelant à croire, à tort, un fichier a été écrit alors qu'elle ne l'était pas.vous avez raison, mais c'est la lecture du fichier. L'écriture doit vider le décorateur (et ne pas compter sur la fermeture) - si il y a un décorateur. Je passe par quelques particularités ici - injustement fermé
Le modèle d'étouffer le nettoyage des exceptions est souvent appliquée sans égard pour ce que le nettoyage implique. Dans certains cas, c'est bien, mais comme d'habitude il semble dangereux. Quant à votre lien (fermée) de la question, je suggère que vous commencez avec un peu moins de "trame de fond". Ce que vous voulez vraiment le savoir (d'après ce que je peux dire) est la façon de traiter avec une exception générée à partir d'un constructeur qui est censé acquérir la propriété si le passé-stream. Ma suggestion serait que ces constructeurs devraient fermer le passé-stream si ils jettent une exception, ou bien être enveloppé dans une usine de la méthode permettant de le faire.
Bien que nécessaire, c'est moches, les code. Quelles devraient être les quelques lignes qui s'est transformé en un désordre des étendues avec un enchevêtrement de spaghetti de flux. Et de penser à toute cette complexité a été ajouté par souci de simplicité! Rend moi la nostalgie pour les jours de l'assemblée.
OriginalL'auteur Mr_and_Mrs_D