Close file in finally block doesn't work

21,968

Solution 1

The variable fr only has scope within the try block. It is out of scope in the finally block. You need to declare it before the try block:

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

This is quite a common pattern of code, so it's good to remember it for future similar situations.

Consider throwing IOException from this method - printing track traces isn't very helpful to callers, and you wouldn't need the nested try catch around fr.close()

Solution 2

Now finally block is not needed,

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

    String line = null;

    }

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

now automatically close your readers

Share:
21,968
noMAD
Author by

noMAD

"State is the root of all evil"

Updated on July 30, 2022

Comments

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

    The fr.close() shows an error:

    fr cannot be resolved

    I had read that closing a file in the finally block is a good practice.
    What is that am doing wrong?