这种用于处理Java中的IO异常的模式是否正确?

use*_*917 1 java io

在下面的代码片段中,如果抛出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)

Jon*_*eet 6

这两个例外都将被抛回调用者......虽然在任何特定情况下都是一个例外.如果外部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.