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.exit
或 JVM
这样的崩溃情况呢?我知道这些条件不适用于 finally
块。那么是否存在try-with-resources失败的情况?
这只是我的好奇心,有人可以解释一下吗?
如果 VM 以任何方式终止,任何内存和文件通道都将被释放。如果您在相应的关闭操作中有自定义代码并且 VM 崩溃,我希望此代码不会 运行 但那几乎不会发生。大多数错误都由 VM 处理,在任何情况下都会调用 close 方法。
try-with-resource 只是一个语法糖,可以让您免去弄乱 finally
子句的麻烦。 try
块内发生的任何事情 "java-ish" 都不会阻止资源关闭 - 返回、抛出异常等。
任何突然终止 JVM 的操作(例如调用 System#exit
、终止 JVM 的进程、拔掉计算机电源等)都不会被处理,就像它不是由老式的 finally
子句。
无论错误情况如何,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.exit
或 JVM
这样的崩溃情况呢?我知道这些条件不适用于 finally
块。那么是否存在try-with-resources失败的情况?
这只是我的好奇心,有人可以解释一下吗?
如果 VM 以任何方式终止,任何内存和文件通道都将被释放。如果您在相应的关闭操作中有自定义代码并且 VM 崩溃,我希望此代码不会 运行 但那几乎不会发生。大多数错误都由 VM 处理,在任何情况下都会调用 close 方法。
try-with-resource 只是一个语法糖,可以让您免去弄乱 finally
子句的麻烦。 try
块内发生的任何事情 "java-ish" 都不会阻止资源关闭 - 返回、抛出异常等。
任何突然终止 JVM 的操作(例如调用 System#exit
、终止 JVM 的进程、拔掉计算机电源等)都不会被处理,就像它不是由老式的 finally
子句。