当try或catch块被中断时,finally块何时不执行? doc说“如果执行try或catch代码的线程被中断或终止,即使整个应用程序继续执行,finally块也可能无法执行”。有人可以举例说明这种情况吗?
答案 0 :(得分:9)
可以找到好的答案here。
除了System.exit()
之外,如果JVM由于某种原因崩溃(例如try
块中的无限循环),则finally块将不会运行。
就线程本身而言,只有在使用stop()
方法(或suspend()
没有resume()
)停止时,才会执行finally
块。对interrupt()
的调用仍会导致finally
块被执行。
值得注意的是,return
块中的任何finally
语句都将覆盖try
/ {{1}中的任何返回或异常抛出如果发生这种情况,程序行为很快就会变得不稳定并且难以调试。没有什么值得采取预防措施(因为它只发生在非常罕见的情况下),但值得注意,以便在发生时能够识别它。
答案 1 :(得分:7)
使finally
无法执行的唯一合法方法是在System.exit
或Runtime.halt
try
或catch
答案 2 :(得分:1)
突然结束之前的申请,例如
System.exit();
即使在finally
阻止之前返回(例如在try
阻止中),也会在finally
之后执行。
答案 3 :(得分:1)
这指的是(大部分)在正常Java执行的包络之外的东西。
如果您的线程(成功)在System.exit()
块或try
块中调用catch
,则该调用将不会在JLS中使用的意义上“终止” 。如果另一个线程调用System.exit()
,则会发生同样的事情。在这种情况下,JVM 只是运行关闭挂钩。
如果JVM(硬盘)崩溃,所有Java活动都会立即停止。
如果操作系统(硬盘)杀死JVM进程,则所有Java活动都会立即停止。
如果CPU芯片的电源关闭......