try-with-resource vs finally优先级

Jir*_*ser 4 java try-with-resources

try-with-resource构造的优先规则是什么?这是一个例子(注意:所有提到的类都实现Closeable):

try (Page closeablePage = page;
     PipedOutputStream out = outs;
     SequenceWriter sequenceWriter = mapper.writer().writeValuesAsArray(out)) {
  // do stuff
} finally {
  callback.run();
}
Run Code Online (Sandbox Code Playgroud)

回调何时运行?我的假设是:

  1. 关闭 SequenceWriter
  2. 关闭 PipedOutputStream
  3. 关闭 Page
  4. 运行回调

我错了吗?

Tun*_*aki 7

该语句将finally关闭所有资源后运行该块 try-with-resources.

这在JLS 第14.20.3.2节中指定,引用:

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

此外,所有资源都以反向声明顺序关闭.引用部分14.20.3(重点煤矿):

资源以与初始化资源相反的顺序关闭.仅当资源初始化为非空值时才关闭资源.关闭一个资源的例外不会阻止关闭其他资源.如果先前由初始化程序,try块或资源关闭抛出异常,则会抑制此类异常.

这意味着您的假设是正确的.