为什么我需要最终使用来关闭资源?

Mat*_*t G 5 java finally try-catch

大多数时候,我唯一看到的块块就是这样的东西

FileInputStream f;
try{
    f= new FileInputStream("sample.txt");
    //something that uses f and sometimes throws an exception
}
catch(IOException ex){
    /* Handle it somehow */
}
finally{
    f.close();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果f的范围以封闭块结束,为什么我们需要在finally中关闭它?

duf*_*ymo 20

因为垃圾收集是不是一回事资源清理.

例如,如果JDBC连接对象超出范围,则不会向数据库服务器发送信号以指示不再需要打开游标和连接.如果没有这些消息,您最终将耗尽可用的游标和连接数.

与文件句柄和任何其他资源相同.在你自己之后清理.

  • 因为finally块中的代码保证被执行,即使抛出异常也是如此. (5认同)

Jon*_*eet 6

好吧,你给出了一个糟糕的例子 - 我怀疑你的意思是FileInputStream- 但基本原因是Java没有确定性的最终确定.

变量 的范围以f它在(不是try块)中声明的块结束,但这并不意味着不再需要对该对象进行"实时"引用 - 并且垃圾收集器既不会完成对象也不会完成垃圾收集它以任何确定的方式.

除非你想让资源闲置一段任意的时间(并且延迟垃圾收集,因为终结器在内存最终发布之前需要额外的一轮收集),你应该明确地关闭资源.

基本上,Java并不能支持在C++做同样的方式RAII; 你不应该尝试使用它,就好像它是C++一样.