javavm规范方法的突然完成
JavaVM规范在突然方法调用完成主题下有以下语句 “突然完成的方法调用永远不会向其调用程序返回值。” 那么,这段代码中的finally块如何能够返回一个值呢javavm规范方法的突然完成,java,Java,JavaVM规范在突然方法调用完成主题下有以下语句 “突然完成的方法调用永远不会向其调用程序返回值。” 那么,这段代码中的finally块如何能够返回一个值呢 public class WaitTest { public static void main(String[] args) { int j = methodThatExitsAbruptly(0); System.out.println(j); } public static
public class WaitTest {
public static void main(String[] args) {
int j = methodThatExitsAbruptly(0);
System.out.println(j);
}
public static int methodThatExitsAbruptly(int i) {
try {
if (i == 0) {
throw new Exception();
}
return 1;
} catch (Exception e) {
throw e;
} finally {
return 2;
}
}
}
该方法不被视为正常完成1。这是因为在
finally
块中返回一个值,丢弃任何抛出的异常
包含有关执行顺序的详细信息
请记住,永远不要从finally
块返回值。之所以能够做到这一点,可能是因为Java语言中存在设计错误,而之所以仍然能够做到这一点,可能是因为向后兼容的原因
另见:
finally
块中返回值
1 JLS§14.20.2规定: 如果finally块正常完成,那么try语句由于原因R而突然完成
但是返回的是。文档感觉彼此矛盾(参见横线下的实际答案) 有你要问的问题: 2.6.5。突然方法调用完成 […]突然完成的方法调用永远不会向其调用程序返回值 谈到语句和块的完成: 14.1。语句的正常和突然完成 [……] 突然完成总是有一个相关的原因,这是以下原因之一:
- [……]
- 没有价值的回报
- 具有给定值的返回
但是,适用于您的案例的内容正好比@mcepender的内容低一行: 如果finally块正常完成,那么try语句由于原因R而突然完成 如果finally块因原因S而突然完成,则try语句因原因S而突然完成(并且原因R被丢弃)。 (我甚至没有添加格式,页面上已经加粗了)永远不会在
finally
块中返回。