当我尝试在 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++
发生在 从 x
读取值 5
之后。请记住,return
语句之后是一个表达式。当到达 return
语句时,该表达式被求值(它的值被确定),然后该结果值被用作函数的返回值。所以在 myfunc
中,这是发生的顺序:
- 输入
try
block 。
- 计算表达式
x
(例如,获取 x
的值)。
- 将该值设置为函数的返回值。
- 输入
finally
block 。
- 增加
x
。
- 使用第 3 步的返回值退出函数。
所以当我们离开函数时,即使 x
是 6
,返回值也早确定了。递增 x
不会改变这一点。
myfunc
中的代码与此类似:
int y = x;
x++;
在那里,我们读取 x
的值(就像return x
所做的那样),将其分配给y
,然后递增 x
。 y
不受该增量的影响。函数的返回值也是如此。
函数可能更清楚:假设一个 foo
函数输出 "foo"
并返回 5,一个 bar
函数输出“bar”
,然后是这段代码:
int test() {
try {
return foo();
}
finally {
bar();
}
}
...执行foo
,输出"foo"
,然后执行bar
,输出"bar"
, 并以返回值 5
退出 test
。您不希望函数等待调用 foo
直到 after finally
发生(那会很奇怪),事实上它不会t:它在到达 return foo();
语句时调用它,因为它计算表达式 foo()
。 return x;
也是如此:它计算表达式并记住该语句的结果。