资源:Link
首先,try-with-resources实际上不处理任何异常(就像通过记录在代码中完成的一样).基本上,它将从try-catch-finally结构抛出的可能的多个Exception编组为可处理的对象-包含抑制的Exception的Exception.
如果try块引发Exception,则资源将被关闭,并且将禁止产生的Exception.结果,抛出的Exception对象将引用被抑制的Exception.
如果try块未引发Exception,则资源将被关闭,并且将抛出异常.
因此,我们可以得出结论,您的示例不等效:
当使用try-catch-finally时,成功处理后关闭导致的异常将被视为“恰好关闭错误”,而使用try-with-resources语句时,此类异常将与实际发生的异常一样处理.处理.
tl; dr
如果处理资源的关闭包含更多内容,那么try-with-resources语句可能会产生在老式的try-catch-finally中最终不会遇到的错误.这种东西的一个例子是jdbc连接的提交和回滚.
因此,最终产生一些代码
try(Resource resource = new Resource()){
// other code
}
确切的等效条件是:
{
Resource resource = null;
Exception exc = null;
try {
resource = new Resource();
// other code
} catch (Exception e) {
exc = e;
throw e;
} finally {
if (resource != null) {
if (exc != null) {
try {
resource.close();
} catch (Throwable t) {
exc.addSuppressed(t);
}
} else {
resource.close();
}
}
}
}