javavm规范方法的突然完成

javavm规范方法的突然完成,java,Java,JavaVM规范在突然方法调用完成主题下有以下语句 “突然完成的方法调用永远不会向其调用程序返回值。” 那么,这段代码中的finally块如何能够返回一个值呢 public class WaitTest { public static void main(String[] args) { int j = methodThatExitsAbruptly(0); System.out.println(j); } public static

JavaVM规范在突然方法调用完成主题下有以下语句

“突然完成的方法调用永远不会向其调用程序返回值。”

那么,这段代码中的finally块如何能够返回一个值呢

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语言中存在设计错误,而之所以仍然能够做到这一点,可能是因为向后兼容的原因

另见:

PS:您可以配置大多数IDE,以警告您在
finally
块中返回值


1 JLS§14.20.2规定:

如果finally块正常完成,那么try语句由于原因R而突然完成


但是返回的是。

文档感觉彼此矛盾(参见横线下的实际答案)

有你要问的问题:

2.6.5。突然方法调用完成

[…]突然完成的方法调用永远不会向其调用程序返回值

谈到语句和块的完成:

14.1。语句的正常和突然完成

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

  • [……]
  • 没有价值的回报
  • 具有给定值的返回
这也适用于块(14.2)

然后说

8.4.7。方法体

方法体要么是实现该方法的代码块,要么只是一个分号,表示缺少实现

[…]如果一个方法被声明为具有返回类型,那么如果该方法的主体可以正常完成,则会发生编译时错误(§14.1)

TL;DR:突然完成不提供返回值,返回总是突然完成(自身、块和方法体)。
但是,适用于您的案例的内容正好比@mcepender的内容低一行:

如果finally块正常完成,那么try语句由于原因R而突然完成

如果finally块因原因S而突然完成,则try语句因原因S而突然完成(并且原因R被丢弃)。

(我甚至没有添加格式,页面上已经加粗了)

永远不会在
finally
块中返回。