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

时间:2012-01-24 03:15:17

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

fr.close()显示错误:

  

fr无法解决

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

3 个答案:

答案 0 :(得分:22)

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

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

考虑从此方法中抛出IOException - 打印跟踪跟踪对调用者没有多大帮助,您不需要嵌套的try catch fr.close()

答案 1 :(得分:7)

现在终于不需要阻止,

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

    String line = null;

    }

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

现在自动关闭您的读者

答案 2 :(得分:0)

您的示波器存在问题。如果你真的想使用这种语法,你应该像这样解决它:

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

这样,fr将存在于finally块的范围内。