说我有以下try-与资源语句的Java:异常时抛出的尝试,有资源的声明
try (MyResource myResource1 = new MyResource(); MyResource myResource2 = new MyResource()) {
// do stuff...
}
如果MyResource myResource2 = new MyResource()
抛出一个异常,是保证myResource1.close()
会叫什么名字?
说我有以下try-与资源语句的Java:异常时抛出的尝试,有资源的声明
try (MyResource myResource1 = new MyResource(); MyResource myResource2 = new MyResource()) {
// do stuff...
}
如果MyResource myResource2 = new MyResource()
抛出一个异常,是保证myResource1.close()
会叫什么名字?
是的,这是有保证的。从JLS section 14.20.3引用:
资源按照从左到右的顺序进行初始化。 如果资源未能初始化(即其初始化表达式会引发异常),那么try-with-resources语句迄今初始化的所有资源都会关闭。如果所有资源都成功初始化,则try块将正常执行,然后try-with-resources语句的所有非空资源都将关闭。
在这种情况下,如果第二new MyResource()
抛出一个异常,因为myResource1
被初始化成功,它将被关闭。
您可以轻松地尝试:
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:坏资源!
显示第一个资源已关闭。
是的,只要资源实现java.lang.AutoCloseable –
是的,但资源必须实现AutoClosable – Ramanlfc
@Tunaki - 它编译在java 8 –