【问题标题】:What exactly is "Abrupt completion of a finally clause"?究竟什么是“finally 子句的突然完成”?
【发布时间】:2008-12-24 21:04:56
【问题描述】:

根据Java Language Specification

如果有任何封闭的 try 语句,其 try 块包含 throw 语句,则这些 try 语句的任何 finally 子句都会在控制向外转移时执行,直到捕获到抛出的值。请注意,finally 子句的突然完成可能会中断由 throw 语句启动的控制转移。

除了在 finally 块中返回,还有什么其他方法?

【问题讨论】:

    标签: java try-catch


    【解决方案1】:

    从 finally 块中抛出异常也会破坏原始异常(如果有的话)。

    编辑:找到解释“突然完成”的参考。
    来自§14.1: Normal and Abrupt Completion of Statements

    突然完成总是有一个 相关的原因,这是其中之一 以下:

    • 没有标签的休息
    • 给定标签的中断
    • 没有标签的继续
    • 给定标签的继续
    • 没有价值的回报
    • 具有给定值的返回
    • 具有给定值的抛出,包括由 Java 虚拟机

    最后三个是 finally 子句中唯一可能的,除非它在循环内。

    【讨论】:

      【解决方案2】:

      如果 finally 块是 switch case 的一部分,我猜它也可能是 switch 内的 break 语句。 此外,如果 finally 块调用以其他语言实现的方法,它可能会做该语言的编译器喜欢的任何事情。

      【讨论】:

        【解决方案3】:

        Sys.exit() 或强制中止。尤其是 GUI 程序因在异常上调用 Sys.exit() 而臭名昭著,部分原因是在 JVM 1.5 之前存在的一个错误 --- 从 GUI 线程抛出的异常并没有传递到主线程。

        更新:特别是对谁反对这一点。抱歉,但是 Sys.exit() 完全符合突然终止的含义,包括导致堆栈不展开;明天我将针对文档提交一个错误。我在 Sun 担任高级 Java 架构师已有多年的权威。

        【讨论】:

          猜你喜欢
          • 2011-04-06
          • 2018-01-29
          • 2014-09-11
          • 2021-11-13
          • 1970-01-01
          • 2014-10-11
          • 2014-10-28
          • 2012-08-27
          • 2010-11-12
          相关资源
          最近更新 更多