Java 将尝试使用资源始终关闭资源

Java 将尝试使用资源始终关闭资源,java,try-with-resources,Java,Try With Resources,无论错误情况如何,尝试使用资源是否总是关闭资源?我的意思是考虑下面的代码: try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } br是否始终关闭?我阅读过Oracle文档,其中说明: 无论try语句是正常完成还是突然完成,它都将关闭 所以,无论程序是否正常运行或抛出异常,它都会起作用。但是像System.exit或JVM崩溃

无论错误情况如何,尝试使用资源是否总是关闭资源?我的意思是考虑下面的代码:

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}
br
是否始终关闭?我阅读过Oracle文档,其中说明:

无论try语句是正常完成还是突然完成,它都将关闭

所以,无论程序是否正常运行或抛出异常,它都会起作用。但是像
System.exit
JVM
崩溃这样的情况又如何呢?我知道这些条件对
finally
块不起作用。那么,是否存在资源试用失败的情况


这只是出于好奇,有人能解释一下吗?

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

try with resource只是一种语法糖,可以省去你在
finally
子句中的麻烦。在
try
块中发生的任何“java ish”都不会阻止资源关闭-返回、抛出异常等


任何突然终止JVM的行为(如调用
系统#退出
、杀死JVM进程、拔掉计算机电源等)都不会被处理,就像老式的
finally
子句不会处理一样。

不,它也不会在核爆炸蒸发计算机时关闭资源。但幸运的是,我们不需要担心这些案例。为什么要讽刺?提出疑问是错误的?官方文件并没有直截了当地说(),但它似乎朝着结束的方向倾斜。我假设“程序完成后”是在try(资源)结束后。在readers
close
method call
System中设置断点。在
try
块中退出
,看看会发生什么。请参阅,以了解try with resources块的“desugared”形式。