Java 捕获块和资源关闭的实际工作顺序是什么?

Java 捕获块和资源关闭的实际工作顺序是什么?,java,resources,try-with-resources,Java,Resources,Try With Resources,其中有以下内容: try with resources语句可以有catch和finally块 就像普通的try语句一样。在try with resources语句中,任何 在声明资源后运行catch或finally块 关闭 因此,根据文档,如果在试图关闭资源时发生异常,并且我真诚地试图对这条令人悲伤的消息做出某种反应,如下所示: try (OutputStream os = new SampleStream(true)) { os.write(0); // both this and clo

其中有以下内容:

try with resources语句可以有catch和finally块 就像普通的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;
}
关闭出现问题时,挡块将永远等待关闭

我知道,事实并非如此,可以捕获关闭时的try with resources异常。但是,上述规则应该重新制定。怎么做

我知道,事实并非如此,而try with resources例外 关闭时可能会被捕获

右键,也可以在资源初始化时使用

我认为这可能有助于重新表述这个相当尴尬的解释。
而对于与
finally
语句相关的部分来说,这是相当正确的

我们可以说:

try-with-resources语句中的
catch
语句允许捕获此语句任何部分中引发的兼容异常,即1)在资源初始化期间,2)在任何资源关闭期间,或3)在try-with-resources主体中执行的by语句
关于
finally
语句,将在资源关闭后执行(或尝试关闭)

参考:

14.20.3.2。扩展资源试用

包含至少一个
catch
子句和/或
最后
子句称为扩展的try with resources语句

扩展的try with resources语句的含义:

以下是对参考资料的基本尝试的翻译 嵌套在
try catch
try finally
中的语句(§14.20.3.1);或
try catch finally
语句:

翻译的效果是将
ResourceSpecification
try
语句的“内部”。这允许使用扩展的
catch
子句 请尝试使用resources语句捕获由于 自动初始化或关闭任何资源

此外,所有资源都将被关闭(或试图关闭) 关闭)在执行
最终
块时,按照
finally
关键字的意图


谢谢你有趣的推荐和投票。但我认为,我的问题的正确答案将是前面第14.20.3.1段中代码之后的解释。基本的资源尝试。文章的开头是:“在管理单个资源的基本try with resources语句中:”下面是对所有情况的非常透彻的解释。欢迎您。我不确定这部分是否足够,因为“基本资源试用”语句是一种资源试用,没有任何明确的
catch
finally
语句,实际上您的问题涉及扩展的资源试用。是的。完整的答案只需要两部分。但我已经得到了我想要的,所以我把你的答案标记为。。。。但我不明白为什么关于这个主题的文档在不同的段落甚至文档中分布得如此稀疏。@Gangnus我同意。JLS是一个非常好的信息来源,但在中查找特定信息有时可能会很复杂…@Gangnus-原因是JLS的设计初衷不是易于阅读。主要目标是技术准确性和完整性,主要受众是“编写Java编译器的人”和类似工具。因此,在许多地方,JLS非常简洁,使用的语言近乎数学。如果您正在寻找一个易于阅读/理解的解释,首先要看的是Oracle Java教程。
try ResourceSpecification
    Block
Catchesopt
Finallyopt
try {
    try ResourceSpecification
        Block
}
Catchesopt
Finallyopt