我碰巧意识到,情况确实如此。请参阅以下示例:
public class AutoClosableTest {
public static void main(String[] args) throws Exception {
try (MyClosable instance = new MyClosable()) {
if (true) {
System.out.println( "try" );
throw new Exception("Foo");
}
} catch( Exception e ) {
System.out.println( "Catched" );
} finally {
System.out.println( "Finally" );
}
}
public static class MyClosable implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println( "Closed." );
}
}
}
打印:
试试 关闭。
抓住了 最后
try-with-resources旨在避免使用null检查的杂乱的finally段并避免泄漏的资源。为什么资源在捕获部分之前关闭?它背后的原因/想法/限制是什么?
答案 0 :(得分:8)
答案可以在JLS §14.20.3.2中找到;关键部分是最后两段,特别是倒数第二段的最后一句(我强调它):
具有至少一个
try-with-resources
子句和/或catch
子句的finally
语句称为扩展try-with-resources
语句。扩展
try-with-resources
声明的含义:try ResourceSpecification Block [Catches] [Finally]
通过以下翻译给出嵌套在
try-with-resources
或try-catch
或try-finally
声明中的基本try-catch-finally
声明:try { try ResourceSpecification Block } [Catches] [Finally]
翻译的效果是将资源规范放在内部"
try
声明。 这允许扩展catch
语句的try-with-resources
子句由于自动初始化或关闭任何资源而捕获异常。此外,所有资源都会在
finally
块执行时关闭(或尝试关闭),与finally
关键字的意图保持一致。