2012-01-24 1 views
7
try { 
    FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    fr.close(); 
} 

Le fr.close() montre une erreur:Fermer le fichier en bloc finally ne fonctionne pas

fr cannot be resolved

J'avais lu que la fermeture d'un fichier dans le bloc finally est une bonne pratique.
Qu'est-ce que cela fait mal?

Répondre

17

La variable fr a uniquement une portée dans le bloc try. Il est hors de portée dans le bloc finally. Vous devez déclarer avant le try bloc:

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} finally { 
    if (fr != null) { 
     try { 
      fr.close(); 
     } catch (IOException e) { 
      // This is unrecoverable. Just report it and move on 
      e.printStackTrace(); 
     } 
    } 
} 

Ceci est tout à fait un modèle commun de code, donc il est bon de se rappeler pour l'avenir des situations similaires.

envisager de lancer IOException de cette méthode - des traces de piste d'impression ne sont pas très utiles aux appelants, et vous auriez pas besoin les prises d'essai imbriquées autour fr.close()

+0

Si je fais cela, il est dit que je dois ajouter un autre bloc Try en fermant le fichier. J'ai lu un article précédent où il a été dit que rien ne pouvait être fait à ce sujet. Donc, ce serait le meilleur moyen est-il? – noMAD

+0

Oui, c'est ennuyeux. On écrit souvent une méthode utilitaire, appelée "closeQuietly" (ou similaire) pour le faire. Il attrape et ignore l'exception. – user949300

+0

Voir la réponse éditée pour 'try/catch' imbriqué - également un modèle commun – Bohemian

5

Maintenant, enfin, le bloc n'est pas nécessaire,

try (FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr);){ 

    String line = null; 

    } 

} catch(FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} 

maintenant maintenant automatiquement fermé vos lecteurs

+2

Oui, mais seulement dans Java 7. Java 6 et les versions antérieures ne l'ont pas. – user949300

+0

oui, c'est vrai. – Kushan

+0

Au cas où quelqu'un se demanderait pourquoi, cherchez "essayer avec des ressources" – axxis

0

Vous avez un problème avec vos oscilloscopes. Si vous voulez vraiment utiliser cette syntaxe, vous devez fixer comme ceci:

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    if(fr != null) 
     fr.close(); 
} 

cette façon, fr existera dans le champ de bloc enfin.

Questions connexes