您提供的两个片段有很大不同,例如:当catch块本身抛出异常时,finally块仍将由其语义执行.
这是以下片段打印“最后!”,但不是“我怎么样?”:
try {
throw null; // throws NullPointerException!
} catch (Exception e) {
int oops = 1/0; // throws ArithmeticException!
} finally {
System.out.println("Finally!"); // still gets executed!
}
System.out.println("What about me???"); // doesn't get executed!
一般来说,try块的finally实际上总是被执行. try块之后的任何代码都没有这样的保证.
But what if my catch block is just a simple print statement?
仍然无法保证它不会扔东西.例如,某些东西仍可能出错异常详细消息的构造.
即使您尽最大努力保证catch代码是“安全的”并且try语句后面的代码将始终执行,那么问题就变成“为什么?”.为什么最后要避免,然后努力复制它的语义?
最后保证了语义,不需要代码的编写者或读者的证明负担.正因为如此,使用finally块来强制“清理”代码是不恰当的.使用最终保证正确性并增强可写性和可读性.