try-with-resource vs finally优先级

时间:2015-10-06 09:52:34

标签: 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();
}

回调什么时候开始?我的假设是:

  1. 关闭SequenceWriter
  2. 关闭PipedOutputStream
  3. 关闭Page
  4. 运行回调
  5. 我错了吗?

1 个答案:

答案 0 :(得分:7)

location / { if (-e $request_filename.php){ rewrite ^/(.*)$ /$1.php; } } location ~ \.php$ { if ($request_uri ~ ^/([^?]*)\.php(\?.*)?$) { return 302 /$1$2; } fastcgi_... } 块将在finally语句关闭所有资源后运行。

这是在JLS section 14.20.3.2中指定的,引用:

  

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

此外,所有资源都以反向声明顺序关闭。引用section 14.20.3(强调我的):

  

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

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