【问题标题】:what happens to finally block in the following cases?在以下情况下最终阻塞会发生什么?
【发布时间】:2010-04-22 14:59:51
【问题描述】:

如果我有以下代码

      try{

           //some code

      }catch(Exception e){

           //some code

      }finally{

      }

在以下情况下finally块会发生什么

  1. 如果发生任何已检查的异常。

  2. 如果 System.exit() 被调用。

  3. 如果发生任何未经检查的异常。

  4. 如果发生任何错误。

【问题讨论】:

标签: java


【解决方案1】:
  1. finally 块被执行。

  2. finally 块不会执行,除非 System.exit() 抛出异常,在这种情况下会执行 finally 块。 (见How does Java's System.exit() work with try/catch/finally blocks?)

  3. finally 块被执行。

  4. finally 块被执行(不过取决于错误的类型,如果你说的是 JVM 错误,那么真的不知道会发生什么)。

【讨论】:

  • 除非System.exit 抛出SecurityException。
【解决方案2】:

JLS 14.20.2 Execution of try-catch-finally

一切都写得很清楚。 finally 将始终在所有这些情况下执行,除了成功的 System.exit 明显例外。

System.exit(int status)

终止当前运行的 Java 虚拟机 [...] 此方法永远不会正常返回。

【讨论】:

    【解决方案3】:
    1. Finally 将被执行。
    2. Finally 不会被执行,除非System.Exit() 抛出异常。
    3. Finally 将被执行。
    4. Finally 将被执行。

    【讨论】:

      【解决方案4】:
      • 1 和 3 - catch 子句将被触发,然后 - finally 子句
      • 4 - 只会触发finally 子句
      • 3 - 程序将退出并且finally 不会被执行。这是因为“这个方法永远不会正常返回。”finally会在System.exit(0)抛出异常时触发(SecurityException)

      【讨论】:

      • 为了迂腐,System.Exit 可以抛出 SecurityException 并且 finally 将被执行:)
      【解决方案5】:

      假设 finally 块中没有 4 项发生,那么 finally 块将在代码退出之前执行,除非 VM 崩溃,那么所有的赌注都关闭了。 编辑 System.exit() 实际上绕过了finally {}。

      【讨论】:

        【解决方案6】:

        转义 finally 子句的唯一方法是 System.exit。每隔一种情况都会到达 finally 块。

        http://www.javaworld.com/javaworld/jw-02-1997/jw-02-hood.htm

        http://java.sun.com/docs/books/jls/second_edition/html/exceptions.doc.html(第 11.3 节)

        这方面的读物很好。

        【讨论】:

          【解决方案7】:

          1.如果发生任何已检查的异常。 代码流为

          一个。试试...
          湾。 [检查异常]
          C。跳过其余的 try 并为检查的异常执行 catch 块
          d。最后执行

          2.如果 System.exit() 被调用。
          最后被执行。 3.如果发生任何未经检查的异常。
          一种。试试...
          湾。 [未经检查的异常]
          C。跳过其余的尝试并转到 finally
          d。最后执行

          4.如果发生任何错误。
          a.finally 被执行了。但是程序在 JVM 抛出“错误”之前就结束了

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-19
            • 1970-01-01
            • 2012-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-23
            相关资源
            最近更新 更多