使用try-with-resources语句块是否总是会关闭资源?

5
尝试使用with资源语句,无论错误条件如何,都会关闭资源吗?我的意思是考虑以下代码:
try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

标签会被始终闭合吗?我已经阅读了Oracle的文档,文档中说:“无论try语句是正常完成还是异常中止,它都会被关闭。”因此,无论程序是正常运行还是抛出异常,
标签都可以正常工作。但如果出现 System.exitJVM 崩溃等情况呢?我知道这些条件不适用于finally块。所以,有没有一种情况会导致try-with-resources失败呢?
这只是我的好奇心,是否有人可以详细解释一下?

7
不会关闭资源,即使核爆炸将计算机蒸发。但幸运的是,我们不需要担心这些情况。 - Kayaman
2
为什么讽刺?问疑问是错的吗? - Pradeep Simha
官方文档并没有明确说明(https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html),但看起来似乎是倾向于关闭。我认为“程序处理完它之后”是指try(resource)结束之后。 - Display Name
3
在读取器的close方法中设置一个断点,在try块中调用System.exit并观察发生了什么。 - Kai
2个回答

10

try-with-resource只是一种语法糖,可以避免您与 finally 子句搏斗的麻烦。在 try 块内发生的任何“Java风格”事件都不会阻止资源关闭 - 返回、抛出异常等。

任何突然终止JVM的事情(例如调用 System#exit、杀死JVM进程、拔掉计算机等)都不会被处理,就像老式的 finally 子句一样。


3
请参考JLS Sec 14.20.3.1获取try-with-resources块的“desugared”形式。 - Andy Turner

2
如果虚拟机以任何方式终止,则任何内存和文件通道都将被释放。如果您在相应的关闭操作中有自定义代码并且虚拟机崩溃,我预计这些代码将不会运行,但这几乎从未发生过。大多数错误由虚拟机处理,在任何情况下都将调用关闭方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接