Cerrar archivo en bloque finally no funciona

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

La fr.close() muestra un error:

fr no puede ser resuelto

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

OriginalEl autor noMAD | 2012-01-24

3 Kommentare

  1. 18

    La variable fr sólo tiene alcance dentro de la try bloque. Está fuera de alcance en el bloque finally. Es necesario declarar que antes de la try bloque:

    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, así que es bueno recordar para futuras situaciones similares.

    Considerar la posibilidad de lanzar IOException de este método de impresión de la pista de huellas no es muy útil para las personas que llaman, y no necesita el anidado de try catch alrededor de fr.close()

    Si puedo hacer eso, entonces me dice que tengo que añadir otro bloque Try, mientras que el cierre el archivo. He leído un post anterior donde se dijo que no se puede hacer nada acerca de eso. Así, esta sería la mejor manera es?
    Sí, eso es molesto. Uno escribe a menudo un método de utilidad, de nombre «closeQuietly» (o similar) para hacer esto. Atrapa y hace caso omiso de la Excepción.
    Ver editado respuesta para anidada try/catch – también un patrón común
    Hay una razón para no hacer la FileReader fr = new FileReader(file); fuera? Esto eliminaría la necesidad de revisar fr != null, ¿no? Una complicación es que catch (FileNotFoundException e) tiene que ser trasladado a un exterior tratar: gist.github.com/cben/6e092536e8f2072ab83f, pero que todavía se lee limpiador para mí. Pero tal vez eso es sólo mi Python hábitos.

    OriginalEl autor Bohemian

  2. 6

    Ahora, por último, el bloque no es necesario,

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

    ahora se cierran de forma automática a sus lectores

    Sí, pero sólo en Java 7. Java 6 y las versiones anteriores no tienen.
    sí, eso es cierto.
    En caso de que alguien se pregunta por qué es este, el de la búsqueda para «tratar con los recursos»

    OriginalEl autor Kushan

  3. 0

    Usted tiene un problema con su ámbitos. Si usted realmente desea utilizar la sintaxis que debe fijar como este:

    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 existirá en los último bloque del alcance.

    OriginalEl autor marimaf

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea