finally块中的关闭文件不起作用

noM*_*MAD 12 java try-catch-finally

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

fr.close()显示一个错误:

fr无法解决

我曾经读过在finally块中关闭一个文件是一个很好的做法.
那是做错了什么的?

Boh*_*ian 25

该变量fr仅在try块内具有范围.它超出了finally块的范围.您需要在块之前声明它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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一种非常常见的代码模式,因此在将来的类似情况下记住它是件好事.

考虑抛出IOException此方法-打印的轨道痕迹是不是呼叫者非常有帮助,而且你不需要绕嵌套的尝试捕捉fr.close()


Kus*_*han 8

现在终于不需要块了,

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

    String line = null;

    }

} catch(FileNotFoundException fnf) {
    fnf.printStackTrace();
} 
Run Code Online (Sandbox Code Playgroud)

现在自动关闭你的读者

  • 是的,但仅限于Java 7. Java 6及更早版本没有这个. (2认同)
  • 如果有人想知道这是为什么,请搜索“尝试使用资源” (2认同)