【问题标题】:How to avoid a scenario in which finally block does not execute如何避免 finally 块不执行的情况
【发布时间】:2014-11-06 06:45:31
【问题描述】:

我在一次采访中被问到 finally 块什么时候不执行。我回答说,当 JVM 在调用 finally 之前突然关闭或调用 System.exit() 时。然后有人问我如何避免这种情况,以便我们的程序始终保持执行。就是这种情况应该处理。我们能处理这样的情况吗?如果是怎么办? 提前致谢。

【问题讨论】:

    标签: java jakarta-ee


    【解决方案1】:

    即使 finally 失败但仍会执行 shutdownhook。

    答案是-

    Runtime#addShutdownHook
    

    Java 虚拟机响应两种情况而关闭 事件:

    • 程序正常退出,当最后一个非守护线程退出或调用 exit(等效于 System.exit)方法时,或
    • 虚拟机被终止以响应用户中断,例如键入 ^C,或系统范围的事件,例如用户注销或
      系统关闭。

    Java docs

    代码-

    Runtime.addShutdownHook(new Thread {
      public void run() {
        System.out.println("Just before going down..");
      });
    

    【讨论】:

      【解决方案2】:

      如果你用一把足够大的枪杀死你的系统,它最终将不再对你好。您必须拥有一个冗余系统才能让您的代码继续运行。

      【讨论】:

        【解决方案3】:

        oracle 网站上的 Java 教程说。

        finally 块总是在 try 块退出时执行。这 确保即使出现意外情况也会执行 finally 块 发生异常。

        注意:如果在执行 try 或 catch 代码时 JVM 退出, 那么finally块可能不会执行。同样,如果线程 执行 try 或 catch 代码被中断或杀死,finally 即使应用程序作为一个整体,块也可能不会执行 继续。

        http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

        【讨论】:

          猜你喜欢
          • 2012-09-07
          • 1970-01-01
          • 2017-06-27
          • 1970-01-01
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多