Bruce Eckel 在“Java Philosophy”中的第 388 页写道
finally 块总是被执行但是在第 400 页上是完全相反的声明,它可能无法实现
如果构造失败,则不执行 finally 块书中第二条语句的上下文以及示例代码:
//: exceptions/Cleanup.java
// Гарантированное освобождение ресурса
public class Cleanup {
public static void main(String[] args) {
try {
lnputFile in = new InputFile("Cleanup.java")j
try {
String s;
int i = 1;
while((s = in.getLine()) != null)
; // Обработка данных по строкам...
} catch(Exception e) {
System.0ut.println("Перехвачено исключение Exception в main");
e .printStackTrace(System.out);
} finally {
in.dispose();
}
} catch(Exception e) {
System.out.println("Ошибка при конструировании InputFile");
}
}
} /* Output:
dispose() успешен
*///:~
仔细看看背后的逻辑: lnputFile 对象实际上是在它自己的 try 块中构造的。如果发生构造错误,则程序进入外层catch块,不会调用dispose()方法。但是如果构造成功,你需要确保对象已经完成,所以在构造之后立即创建一个新的 try 块。执行最终操作的 finally 块链接到内部 try 块;如果构造失败,finally 块不会被执行,但如果构造成功,它会一直执行
Exception
在此行构造时表示失败( ):如果构造函数内部发生异常
InputFile
,则执行中断并转到外部,但不进入catch
内部,也不会进入内部。try
finally