6

当 try 或 catch 块被中断时,finally 块何时不执行?文档说“如果执行 try 或 catch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也可能不会执行。” 有人可以举例说明这种情况吗?

4

4 回答 4

11

可以在这里找到好的答案。

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

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

还值得注意的是,由于块中的任何return语句finally都将覆盖/块中的任何返回或异常抛出,如果发生这种情况,程序行为会很快变得不稳定且难以调试。没有什么值得采取的预防措施(因为它只发生在极少数情况下),但值得注意,这样你就可以在它发生时识别它。trycatch

于 2013-07-02T11:59:07.547 回答
7

使finally不执行的唯一合法方法是调用System.exitor Runtime.haltin tryorcatch

于 2013-07-02T11:49:34.220 回答
1

This refers to things that are (mostly) outside of the envelope of normal Java execution.

  • If your thread (successfully) calls System.exit() in the try block or a catch block, that call won't "terminate" in the sense used in the JLS. Same thing happens if another thread calls System.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...

于 2013-07-02T12:12:41.057 回答
1

突然结束之前的应用程序,例如

System.exit();

即使是finally块前的返回(例如try块内)也会在finally.

于 2013-07-02T11:51:13.397 回答