当 try 或 catch 块被中断时,finally 块何时不执行?文档说“如果执行 try 或 catch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也可能不会执行。” 有人可以举例说明这种情况吗?
4 回答
可以在这里找到好的答案。
除了 a 之外System.exit()
,如果 JVM 因某种原因崩溃(例如,块中的无限循环try
),finally 块将不会运行。
就线程本身而言,只有使用该stop()
方法(或suspend()
不使用该方法resume()
)停止它时,才会执行该finally
块。调用interrupt()
仍然会导致finally
块被执行。
还值得注意的是,由于块中的任何return
语句finally
都将覆盖/块中的任何返回或异常抛出,如果发生这种情况,程序行为会很快变得不稳定且难以调试。没有什么值得采取的预防措施(因为它只发生在极少数情况下),但值得注意,这样你就可以在它发生时识别它。try
catch
使finally
不执行的唯一合法方法是调用System.exit
or Runtime.halt
in try
orcatch
This refers to things that are (mostly) outside of the envelope of normal Java execution.
If your thread (successfully) calls
System.exit()
in thetry
block or acatch
block, that call won't "terminate" in the sense used in the JLS. Same thing happens if another thread callsSystem.exit()
. In this case the JVM just runs the shutdown hooks.If the JVM (hard) crashes, all Java activity ceases instantly.
If the OS (hard) kills the JVM process, all Java activity ceases instantly.
If the power to the CPU chip goes off...
突然结束之前的应用程序,例如
System.exit();
即使是finally
块前的返回(例如try
块内)也会在finally
.