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块中关闭一个文件是一个很好的做法。
那是做错了什么的?

变量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 – 打印跟踪跟踪对调用者没有多大帮助, 并且您不需要围绕fr.close()的嵌套try catch

现在终于不需要块了,

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

现在自动关闭你的读者

您的示波器有问题。 如果您真的想使用该语法,您应该像这样修复它:

 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的块范围内。