在下面的代码片段中,如果抛出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; } }
Jon Skeet.. 6
这两个例外都将被抛回调用者......虽然在任何特定情况下都是一个例外.如果外部try块的主体抛出然后close
抛出,则调用者只能看到第二个异常.
然而,catch
只是为了重新抛出一块就没有意义了.您的代码将更清晰:
try { // write to file } finally { aBufferedWriter.close(); }
在Java 7中,try-with-resources语句可以自动执行此操作:
try (BufferedWriter writer = new BufferedWriter(...)) { // Use the writer here } // The writer is auto-closed here
这样,你也可以在与主体中的异常分开关闭时使用异常Throwable.getSuppressed
.
这两个例外都将被抛回调用者......虽然在任何特定情况下都是一个例外.如果外部try块的主体抛出然后close
抛出,则调用者只能看到第二个异常.
然而,catch
只是为了重新抛出一块就没有意义了.您的代码将更清晰:
try { // write to file } finally { aBufferedWriter.close(); }
在Java 7中,try-with-resources语句可以自动执行此操作:
try (BufferedWriter writer = new BufferedWriter(...)) { // Use the writer here } // The writer is auto-closed here
这样,你也可以在与主体中的异常分开关闭时使用异常Throwable.getSuppressed
.