编程语言
首页 > 编程语言> > java – try-finally块澄清

java – try-finally块澄清

作者:互联网

参见英文答案 > Why does changing the returned variable in a finally block not change the return value?                                    7个
当我尝试在Java中执行以下函数时:

public static int myfunc (int x) {
    try {
        return x;
    } finally {
        x++;
    }       
}
public static void main (String args[]) {
    int y=5,z;
    z = myfunc(y);
    System.out.println(z);
}

控制台上打印的输出为5,可以预期打印6.知道为什么吗?

解决方法:

…would expect 6 to be printed. Any idea why?

从x读取值5后发生x.请记住,return语句后面的内容是一个表达式.到达return语句时,将计算该表达式(确定其值),然后将该结果值用作函数的返回值.所以在myfunc中,这是发生的事情的顺序:

>输入try块.
>评估表达式x(例如,获取x的值).
>将该值设置为函数的返回值.
>输入finally块.
>递增x.
>使用步骤3中的返回值退出该功能.

因此,当我们离开函数时,即使x为6,返回值也是先前确定的.递增x不会改变这一点.

你在myfunc中的代码类似于:

int y = x;
x++;

在那里,我们读取x的值(就像返回x一样),将其赋值给y,然后递增x. y不受该增量的影响.对于函数的返回值也是如此.

函数可能更清楚:假设foo函数输出“foo”并返回5,并且bar函数输出“bar”,则此代码:

int test() {
    try {
        return foo();
    }
    finally {
        bar();
    }
}

…执行foo,输出“foo”,然后执行bar,输出“bar”,然后从返回值5退出测试.你不希望函数等到调用foo直到最后发生(那就是很奇怪),实际上并没有:它在到达返回foo()时调用它;语句,因为它计算表达式foo().返回x;也是如此:它计算表达式并记住该语句的结果.

标签:java,try-catch-finally,try-finally
来源: https://codeday.me/bug/20190528/1169707.html