如果在一个finally块中关闭了多个资源,是否需要异常处理?
If multiple resources are closed inside a finally block, is exception handling necessary?
一位同事刚刚让我对 finally 块感到不安。他声称如果在finally 块中关闭多个资源,我不必担心异常处理。
所以如果我像这样关闭我的资源
try {
// do stuff
} catch(Exception e) {
// handle stuff
} finally {
resource1.close();
resource2.close();
}
在resource1.close()处出现异常,会调用resource2的close()方法吗?
这取决于。如果您在 try-catch 块中抛出的唯一异常(明确地或潜在地)是关闭操作,则您不需要异常处理。然而,大多数时候,关闭操作本身被声明为抛出异常,因此,您无论如何都需要将它们放在 try-catch 块中。
一个简单的检查将确认:
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")) {
}
将同时打印两者。
一位同事刚刚让我对 finally 块感到不安。他声称如果在finally 块中关闭多个资源,我不必担心异常处理。
所以如果我像这样关闭我的资源
try {
// do stuff
} catch(Exception e) {
// handle stuff
} finally {
resource1.close();
resource2.close();
}
在resource1.close()处出现异常,会调用resource2的close()方法吗?
这取决于。如果您在 try-catch 块中抛出的唯一异常(明确地或潜在地)是关闭操作,则您不需要异常处理。然而,大多数时候,关闭操作本身被声明为抛出异常,因此,您无论如何都需要将它们放在 try-catch 块中。
一个简单的检查将确认:
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")) {
}
将同时打印两者。