当我尝试在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。知道为什么吗?
发布于 2015-07-21 14:23:57
...would预计将打印6。知道为什么吗?
从x读取值5之后,会发生x++。请记住,return语句后面的是一个表达式。当到达return语句时,将计算该表达式(确定其值),然后将结果值用作函数的返回值。因此,在myfunc中,发生的顺序如下:
输入表达式返回值(例如,获取x).
x.
try的值作为函数的返回值。因此,当我们离开函数时,即使x为6,返回值也是在前面确定的。递增x不会改变这一点。
您在myfunc中的代码类似于:
int y = x;
x++;在这里,我们读取x的值(就像return x一样),将其赋给y,然后递增x。y不受该增量的影响。函数的返回值也是如此。
使用函数可能会更清楚:假设一个输出"foo"并返回5的foo函数和一个输出"bar"的bar函数,则如下代码:
int test() {
try {
return foo();
}
finally {
bar();
}
}...executes foo,输出"foo",然后执行bar,输出"bar",并使用返回值5退出test。您不会期望该函数等到finally发生之后才调用foo (这会很奇怪),实际上它并没有:它在到达return foo();语句时调用它,因为它计算表达式foo()。return x;也是如此:它计算表达式并记住该语句的结果。
发布于 2015-07-21 14:16:40
最后,块总是会执行,但是您在try块本身中返回值。在返回x的值之后,x在finally中递增。
public static int myfunc (int x) {
try {
return x; // returning
} finally {
x++; // now incremented.
}
}注意:只是为了测试,如果你使用try-catch-finally,只需返回最后(不推荐)并查看。
发布于 2015-07-21 14:18:14
不管发生什么,最终都会被执行,在这种情况下,返回的值是5,然后递增x。
package qwerty7;
public class Stack {
public static int myfunc (int x) {
try {
return x;
} finally {
System.out.println("I'm executing!");
x++;
}
}
public static void main (String args[]) {
int y=5,z;
z = myfunc(y);
System.out.println(z);
}
}
Output:
I'm executing!
5https://stackoverflow.com/questions/31531629
复制相似问题