一位同事对我最后的阻挠感到不安。他声称,如果在finally块内关闭了多个资源,则不必担心异常处理。
所以如果我这样关闭我的资源
try {
// do stuff
} catch(Exception e) {
// handle stuff
} finally {
resource1.close();
resource2.close();
}
并且resource1.close()发生异常,resource2的close()方法会被调用吗?
最佳答案
简单检查即可确认:
class MyResource implements AutoCloseable {
private final String name;
MyResource(String name) { this.name = name; }
@Override public void close() throws IOException {
System.out.println("Closing " + name);
throw new IOException();
}
}
public static void main(String[] args) throws IOException {
MyResource a = new MyResource("a");
MyResource b = new MyResource("b");
try {
} finally {
a.close();
b.close();
}
}
这将打印
"Closing a"
,然后打印堆栈跟踪。 "Closing b"
将不会打印。相反: try (MyResource a = new MyResource("a");
MyResource b = new MyResource("b")) {
}
将同时打印。
关于java - 如果在finally块中关闭了多个资源,是否需要进行异常处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35606625/