在try-with-resources声明期间抛出异常

时间:2016-02-26 20:38:08

标签: java try-with-resources

假设我在Java中有以下try-with-resources语句:

try (MyResource myResource1 = new MyResource(); MyResource myResource2 = new MyResource()) {
    // do stuff...
}

如果MyResource myResource2 = new MyResource()引发异常,是否可以保证会调用myResource1.close()

2 个答案:

答案 0 :(得分:13)

是的,这是有保证的。引自JLS section 14.20.3

  

资源按从左到右的顺序初始化。 如果资源无法初始化(即,其初始化程序表达式抛出异常),则try-with-resources语句到目前为止初始化的所有资源都将关闭。如果所有资源都成功初始化,则try块将正常执行,然后关闭try-with-resources语句的所有非空资源。

在这种情况下,如果第二个new MyResource()引发异常,那么由于myResource1已成功初始化,它将被关闭。

答案 1 :(得分:2)

您可以轻松尝试:

public static void main(String[] args) {
    try (Resource1 myResource1 = new Resource1(); Resource2 myResource2 = new Resource2()) {
        // do stuff...
    }
}


class Resource1 implements AutoCloseable {

    @Override
    public void close() {
        System.out.println("Closing Resource1...");
    }

}

class Resource2 implements AutoCloseable {

    public Resource2() {
        throw new RuntimeException("Bad resource!");
    }

    @Override
    public void close() {
        System.out.println("Closing Resource2...");
    }

}

<强>输出:

  

关闭资源1 ...

     

线程中的异常&#34; main&#34; java.lang.RuntimeException:错误的资源!

显示第一个资源已关闭。