Java在try-catch-finally机制中的返回值

问题描述 投票:13回答:4

我刚遇到以下代码:

public class TestFinally {
    public static void main(String[] args) {
        int returnValue = function();

        System.out.println("Return value: " + returnValue);
    }

    public static int function() {
        try {
            return 1;
        } catch (Exception e){
            return 2;
        } finally{
            return 3;
        }
    }
}

毫无疑问,运行此代码将产生“返回值:3”的输出。

但是,我很好奇:

  1. JVM中内部机制。有谁知道VM是否通过覆盖第一个“ return 1”来实际替换堆栈上的返回值?如果是这样,我在哪里可以找到更多信息。
  2. 我还没有找到以这种方式使用并在实现中允许的finally机制中用于返回的用途在JVM中。如果此代码构造用作返回的手段错误代码,我认为有更好的方法记录错误或返回这些错误代码。有没有人发现这样的用途构造?

非常感谢。

干杯,维尔恩

java coding-style jvm
4个回答
13
投票

我在Java语言规范中发现的至少定义了您的代码段应返回3。当然,它没有提到JVM应该如何实现这一点,以及人们可以做哪些可能的优化。

14.20.2节定义

如果try块的执行由于其他任何原因R突然完成,则将执行finally块。然后有一个选择:

  1. 如果finally块正常完成,则try语句由于原因R突然完成。
  2. 如果finally块由于原因S突然完成,那么try语句由于原因S突然完成(并且原因R被丢弃了。]]

以及第14章的开头(更确切地说是section 14.1)指定了什么是正常且突然的完成。例如,具有给定值的return是突然完成。

因此,在这种情况下,finally块会突然完成(原因:具有给定值的return),因此出于相同的原因,try将突然完成(并返回3)。这也在section 14.17 about the return statement中得到确认

如果表达式的求值正常完成,产生一个值V,则return语句突然完成,原因是返回值为V。


5
投票

FWIW,我收到功能警告:


4
投票

实现取决于JVM,并且有许多JVM。您可以深入研究OpenJDK's source code以了解其如何实现finally,但这不是唯一的方法。就语言而言,重要的是行为。


© www.soinside.com 2019 - 2024. All rights reserved.