【发布时间】:2020-01-08 09:36:15
【问题描述】:
如果 PrintWriter 抛出异常,是否会执行以下 finally 子句?
try{
PrintWriter out = new PrintWriter(filename);
try {
//output
} finally {
out.close();
}
} catch {
//handle exception
}
如果 PrintWriter 抛出异常,那么嵌套的 try 块将永远不会被执行,但是为什么嵌套的 finally 子句仍然会被执行执行,即使它被嵌套和跳过?
更新: 我跑了一些测试,如果在嵌套的 try 子句之前抛出异常,那么嵌套的 finally 将不会被执行。 如果在嵌套的 try 子句中抛出异常,则内部的 finally 和外部的 catch 将被执行。
【问题讨论】:
-
finally块与您的打印作者声明无关 -
PrintWriter implements AutoCloseable因此,您可以只使用try和try (PrintWriter out = new PrintWriter(filename)) { ... } catch { ... }等资源,其中不需要finally(对于out)。内部try里面有什么可以抛出Exception? -
它实际上不会被执行,但不可避免的应用程序崩溃会导致操作系统关闭文件(如果它甚至被创建的话)......