3

根据Java 语言规范

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

除了在 finally 块中返回之外,还有哪些其他方法?

4

3 回答 3

6

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

编辑:找到解释“突然完成”的参考。
来自§14.1:语句的正常和突然完成

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

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

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

于 2008-12-24T21:06:09.687 回答
0

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

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

于 2008-12-24T21:08:00.867 回答
0

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

于 2008-12-25T06:35:15.903 回答