如果我有多个资源,则在try catch中,首先关闭哪个资源?
public class TestRes {
public static void main(String[] args) {
TestRes tr = new TestRes();
tr.test();
}
public void test() {
try (MyResource1 r1 = new MyResource1(); MyResource2 r2 = new MyResource2(); ) {
System.out.print("T ");
} catch (IOException ioe) {
System.out.print("IOE ");
} finally {
System.out.print("F ");
}
}
class MyResource1 implements AutoCloseable {
public void close() throws IOException {
System.out.print("1 ");
}
}
class MyResource2 implements Closeable {
public void close() throws IOException {
throw new IOException();
}
}
}
此示例输出:
T 1 IOE F
如果我更改订单,那么...
public class TestRes {
public static void main(String[] args) {
TestRes tr = new TestRes();
tr.test();
}
public void test() {
try (MyResource2 r2 = new MyResource2(); MyResource1 r1 = new MyResource1();) {
System.out.print("T ");
} catch (IOException ioe) {
System.out.print("IOE ");
} finally {
System.out.print("F ");
}
}
class MyResource1 implements AutoCloseable {
public void close() throws IOException {
System.out.print("1 ");
}
}
class MyResource2 implements Closeable {
public void close() throws IOException {
throw new IOException();
}
}
}
我得到相同的输出-为什么?
答案 0 :(得分:7)
您似乎认为close()
方法中的异常将阻止其他close()
方法的调用。那是错误。
Java语言规范的第14.20.3. try-with-resources部分说:
资源以与初始化时相反的顺序关闭。仅当资源初始化为非空值时,它才关闭。 关闭一个资源的异常不会阻止其他资源的关闭。如果初始化程序,try块或资源关闭之前已引发异常,则被抑制。
这意味着将始终执行打印close()
的{{1}}方法,并且第一部分回答您的“哪个1
首先运行?” 问题。