在Oracle Java documentation on try-with-resources中写道:
try-with-resources语句可以包含catch并最终阻塞 像普通的try语句一样。在try-with-resources语句中,任何 在声明的资源被使用之后运行catch或finally块 关闭。
因此,根据文档,如果在尝试关闭资源时发生异常,我正在诚实地尝试对这条令人遗憾的消息做出某种反应,如下所示:
try (OutputStream os = new SampleStream(true)) {
os.write(0); // both this and closing can throw IOWriteException
}
catch (IOWriteException e) {
//do something wise;
}
遇到关闭问题,catch块将永远等待关闭。
我知道,实际上并非如此,并且可以捕获关闭时的try-with-resources异常。但随后应重新制定所提到的规则。怎么样?
答案 0 :(得分:2)
我知道,实际上并非如此,并且try-with-resources异常 关闭时会被抓住。
正确,也可以初始化资源。
我认为the extended try-with-resources part of the JLS可能有助于重新表述这个相当尴尬的解释。
尽管与finally
语句有关的部分相当正确。
我们可以这样说:
try-with-resources语句中的catch
语句允许捕获在该语句的任何部分中抛出的兼容异常,即 1)在资源初始化期间,2)在资源关闭期间资源或3)通过在try-with-resources主体中执行的语句。
关于finally
语句,将在关闭资源(或尝试关闭)后执行。
参考:
14.20.3.2。扩展的尝试资源
一个try-with-resources语句,至少包含一个
catch
子句和/或finally
子句称为扩展的try-with-resources语句。扩展的try-with-resources语句的含义:
try ResourceSpecification
Block
Catchesopt
Finallyopt
以下翻译将赋予基本的try-with-resources 嵌套在
try-catch
或try-finally
内的语句(§14.20.3.1)或try-catch-finally
语句:
try {
try ResourceSpecification
Block
}
Catchesopt
Finallyopt
翻译的效果是将
ResourceSpecification
try
语句的“内部”。这允许扩展的catch
子句 try-with-resources语句捕获由于 自动初始化或关闭任何资源。此外,所有资源都将被关闭(或试图被关闭) 与
finally
块执行时保持一致finally
关键字的意图。