【问题标题】:Is there possibility that a finally block might not execute? [duplicate]是否有可能最终块可能无法执行? [复制]
【发布时间】:2011-01-25 22:53:14
【问题描述】:

我们知道,无论是抛出异常,还是捕获并处理异常,finally块都会被执行,所以我很好奇finally块有没有可能不执行。

如果 System.exit() 在 try 或 catch 中被调用,那么 finally 也会被调用吗?

【问题讨论】:

  • 如果你拔掉电脑的插头,finally块不会被执行。

标签: java exception


【解决方案1】:

如果在执行trycatch 代码时JVM 退出,则finally 块可能不会执行。同样,如果执行trycatch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也可能不会执行。

来源:java.sun.com: Java Tutorial: The finally Block

【讨论】:

  • 记下那里的“可能”这个词。
【解决方案2】:

System.exit() 将阻止 finally 块执行。

【讨论】:

    【解决方案3】:

    在 Java 文档中:

    http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html

    它解释得很好。

    他们确实注意到,如果 JVM 退出,finally 块将不会被调用。或者,如果正在运行代码块的线程被杀死,finally 块将 被调用。在所有其他情况下,它都会。

    【讨论】:

      【解决方案4】:
      try {
          System.out.println("BEFORE");
          System.exit(0);
          System.out.println("AFTER");
      } finally {
          System.out.println("FINALLY");
      }
      

      这会给你输出:

      BEFORE
      

      【讨论】:

        【解决方案5】:

        我现在能想到的一件事是OutOfMemoryError,在这种情况下,您的应用程序中可能无法执行更多代码。

        【讨论】:

        • 即使发生 OutOfMemoryError,finally 块也会被执行。 finally 块本身的执行当然可能会导致 OutOfMemoryError 本身,但这也可能发生,即使 try 块成功完成。
        【解决方案6】:

        System.exit(1);你可以使用

        【讨论】:

          【解决方案7】:

          如果某些 Java Native Interface 方法出现段错误(java 外部的库函数但从那里调用崩溃),由于整个 JVM 停止,finally 方法也不会被调用。

          JVM 本身的错误也会导致崩溃并阻止一切继续执行。

          【讨论】:

            【解决方案8】:

            try-catch 异常块中的 finally 子句始终执行,无论在正常的 java 程序流中是否发生异常。如果在 finally 子句之前停止执行流程,那么 finally 块将不会被执行。

            我们可以在finally之前使用System.exit(1);来阻塞并停止程序的执行流程。

            【讨论】:

              【解决方案9】:

              我能想到的另一种情况(其他答案中忽略了)是exception 被扔进finally 块内,在这种情况下finally 块不会是 "完全”执行。

              【讨论】:

                猜你喜欢
                • 2017-11-11
                • 2012-01-06
                • 2011-03-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-01
                • 1970-01-01
                相关资源
                最近更新 更多