当try或catch块被中断时,finally块何时不执行

时间:2013-07-02 11:47:53

标签: java finally

当try或catch块被中断时,finally块何时不执行? doc说“如果执行try或catch代码的线程被中断或终止,即使整个应用程序继续执行,finally块也可能无法执行”。有人可以举例说明这种情况吗?

4 个答案:

答案 0 :(得分:9)

可以找到好的答案here

除了System.exit()之外,如果JVM由于某种原因崩溃(例如try块中的无限循环),则finally块将不会运行。

就线程本身而言,只有在使用stop()方法(或suspend()没有resume())停止时,才会执行finally块。对interrupt()的调用仍会导致finally块被执行。

值得注意的是,return块中的任何finally语句都将覆盖try / {{1}中的任何返回或异常抛出如果发生这种情况,程序行为很快就会变得不稳定并且难以调试。没有什么值得采取预防措施(因为它只发生在非常罕见的情况下),但值得注意,以便在发生时能够识别它。

答案 1 :(得分:7)

使finally无法执行的唯一合法方法是在System.exitRuntime.halt

中致电trycatch

答案 2 :(得分:1)

突然结束之前的申请,例如

System.exit();

即使在finally阻止之前返回(例如在try阻止中),也会在finally之后执行。

答案 3 :(得分:1)

这指的是(大部分)在正常Java执行的包络之外的东西。

  • 如果您的线程(成功)在System.exit()块或try块中调用catch,则该调用将不会在JLS中使用的意义上“终止” 。如果另一个线程调用System.exit(),则会发生同样的事情。在这种情况下,JVM 只是运行关闭挂钩。

  • 如果JVM(硬盘)崩溃,所有Java活动都会立即停止。

  • 如果操作系统(硬盘)杀死JVM进程,则所有Java活动都会立即停止。

  • 如果CPU芯片的电源关闭......