2016-02-26 70 views
4

说我有以下try-与资源语句的Java:异常时抛出的尝试,有资源的声明

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

如果MyResource myResource2 = new MyResource()抛出一个异常,是保证myResource1.close()会叫什么名字?

+3

是的,只要资源实现java.lang.AutoCloseable –

+0

是的,但资源必须实现AutoClosable – Ramanlfc

+0

@Tunaki - 它编译在java 8 –

回答

9

是的,这是有保证的。从JLS section 14.20.3引用:

资源按照从左到右的顺序进行初始化。 如果资源未能初始化(即其初始化表达式会引发异常),那么try-with-resources语句迄今初始化的所有资源都会关闭。如果所有资源都成功初始化,则try块将正常执行,然后try-with-resources语句的所有非空资源都将关闭。

在这种情况下,如果第二new MyResource()抛出一个异常,因为myResource1被初始化成功,它将被关闭。

1

您可以轻松地尝试:

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 ...

异常在线程 “主” 了java.lang.RuntimeException:坏资源!

显示第一个资源已关闭。

+0

我编辑它来构造对象。问题的关键在于,在try语句中,在括号之间抛出的异常是否会被捕获,或者只是在被捕获的大括号之间的异常。 –

+2

这并不回答这个问题,它是“有保证吗?”。这回答了你的特定JDK,对于这个特定的执行,它工作。 – Tunaki

+0

@Tunaki它确实回答了这个问题。我只是选择通过一个简单的例子来展示它,而不是引用规范。 – manouti

相关问题