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

El fr.close() muestra un error:Cerrar archivo en bloque finally no funciona

fr cannot be resolved

había leído que el cierre de un archivo en el bloque finally es una buena práctica.
¿Qué estoy haciendo mal?

Respuesta

17

La variable fr solo tiene el alcance dentro del bloque try. Está fuera de alcance en el bloque final. Es necesario declarar que antes el bloque try:

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(); 
     } 
    } 
} 

Este es un patrón común de código, por lo que es bueno recordar que para futuras situaciones similares.

considera lanzar IOException de este método - rastros de la pista de impresión no es muy útil para las personas que llaman, y no necesitaría el intento de captura anidada alrededor fr.close()

+0

Si hago eso, entonces digo que necesito agregar otro bloque Try al cerrar el archivo. Leí una publicación anterior en la que se decía que no se podía hacer nada al respecto. Entonces, ¿esta sería la mejor manera? – noMAD

+0

Sí, eso es molesto. A menudo se escribe un método de utilidad, llamado "closeQuietly" (o similar) para hacer esto. Captura e ignora la Excepción. – user949300

+0

Consulte la respuesta editada para 'try/catch' anidado - también un patrón común – Bohemian

5

Ahora, finalmente, no es necesaria bloque,

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

    String line = null; 

    } 

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

ahora cerrar automáticamente sus lectores

+2

Sí, pero solo en Java 7. Java 6 y versiones anteriores no tienen esto. – user949300

+0

sí, eso es cierto. – Kushan

+0

En caso de que alguien se pregunte por qué es esto, busque "probar con recursos" – axxis

0

Usted tiene un problema con sus alcances. Si realmente desea utilizar la sintaxis que se debe fijar de esta manera:

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(); 
} 

de esa manera, fr va a existir en el ámbito de bloque de fin.

Cuestiones relacionadas