try-with-resources 总是会关闭资源

Will try-with-resources always close the resources

无论错误情况如何,try-with-resources 都会始终关闭资源吗?我的意思是考虑以下代码:

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

br会一直关闭吗?我已阅读 Oracle 文档,其中写道:

it will be closed regardless of whether the try statement completes normally or abruptly

所以不管程序正常运行还是抛出异常都会起作用。但是像 System.exitJVM 这样的崩溃情况呢?我知道这些条件不适用于 finally 块。那么是否存在try-with-resources失败的情况?

这只是我的好奇心,有人可以解释一下吗?

如果 VM 以任何方式终止,任何内存和文件通道都将被释放。如果您在相应的关闭操作中有自定义代码并且 VM 崩溃,我希望此代码不会 运行 但那几乎不会发生。大多数错误都由 VM 处理,在任何情况下都会调用 close 方法。

try-with-resource 只是一个语法糖,可以让您免去弄乱 finally 子句的麻烦。 try 块内发生的任何事情 "java-ish" 都不会阻止资源关闭 - 返回、抛出异常等。

任何突然终止 JVM 的操作(例如调用 System#exit、终止 JVM 的进程、拔掉计算机电源等)都不会被处理,就像它不是由老式的 finally 子句。