在下面的代码片段中,如果抛出ex1,将被第二个catch块捕获,还是会被抛回到方法的调用者?
如果它被抛回到调用者,然后在finally块(ex2)中发生第二个异常,这是否意味着2个异常将被抛回调用者(ex1和ex2)?
try {
// write to file
} catch (IOException ex1) {
throw ex1;
} finally {
try {
aBufferedWriter.close();
} catch (IOException ex2) {
throw ex2;
}
}
Run Code Online (Sandbox Code Playgroud)
这两个例外都将被抛回调用者......虽然在任何特定情况下都是一个例外.如果外部try块的主体抛出然后close抛出,则调用者只能看到第二个异常.
然而,catch只是为了重新抛出一块就没有意义了.您的代码将更清晰:
try {
// write to file
} finally {
aBufferedWriter.close();
}
Run Code Online (Sandbox Code Playgroud)
在Java 7中,try-with-resources语句可以自动执行此操作:
try (BufferedWriter writer = new BufferedWriter(...)) {
// Use the writer here
} // The writer is auto-closed here
Run Code Online (Sandbox Code Playgroud)
这样,你也可以在与主体中的异常分开关闭时使用异常Throwable.getSuppressed.