catch块和资源关闭的真正工作顺序是什么?

时间:2018-09-08 19:23:19

标签: java resources try-with-resources

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异常。但随后应重新制定所提到的规则。怎么样?

1 个答案:

答案 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-catchtry-finally内的语句(§14.20.3.1)或   try-catch-finally语句:

try {
    try ResourceSpecification
        Block
}
Catchesopt
Finallyopt
  

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

     

此外,所有资源都将被关闭(或试图被关闭)   与finally块执行时保持一致   finally关键字的意图。