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