【发布时间】:2008-12-24 21:04:56
【问题描述】:
根据Java Language Specification:
如果有任何封闭的 try 语句,其 try 块包含 throw 语句,则这些 try 语句的任何 finally 子句都会在控制向外转移时执行,直到捕获到抛出的值。请注意,finally 子句的突然完成可能会中断由 throw 语句启动的控制转移。
除了在 finally 块中返回,还有什么其他方法?
【问题讨论】:
根据Java Language Specification:
如果有任何封闭的 try 语句,其 try 块包含 throw 语句,则这些 try 语句的任何 finally 子句都会在控制向外转移时执行,直到捕获到抛出的值。请注意,finally 子句的突然完成可能会中断由 throw 语句启动的控制转移。
除了在 finally 块中返回,还有什么其他方法?
【问题讨论】:
从 finally 块中抛出异常也会破坏原始异常(如果有的话)。
编辑:找到解释“突然完成”的参考。
来自§14.1: Normal and Abrupt Completion of Statements:
突然完成总是有一个 相关的原因,这是其中之一 以下:
- 没有标签的休息
- 给定标签的中断
- 没有标签的继续
- 给定标签的继续
- 没有价值的回报
- 具有给定值的返回
- 具有给定值的抛出,包括由 Java 虚拟机
最后三个是 finally 子句中唯一可能的,除非它在循环内。
【讨论】:
如果 finally 块是 switch case 的一部分,我猜它也可能是 switch 内的 break 语句。 此外,如果 finally 块调用以其他语言实现的方法,它可能会做该语言的编译器喜欢的任何事情。
【讨论】:
Sys.exit() 或强制中止。尤其是 GUI 程序因在异常上调用 Sys.exit() 而臭名昭著,部分原因是在 JVM 1.5 之前存在的一个错误 --- 从 GUI 线程抛出的异常并没有传递到主线程。
更新:特别是对谁反对这一点。抱歉,但是 Sys.exit() 完全符合突然终止的含义,包括导致堆栈不展开;明天我将针对文档提交一个错误。我在 Sun 担任高级 Java 架构师已有多年的权威。
【讨论】: