当我尝试在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。知道为什么吗?
答案 0 :(得分:5)
......预计会打印6张。知道为什么吗?
从x++
读取值5
后,x
发生了。请记住,return
语句后面的内容是表达式。当达到return
语句时,该表达式已计算(其值已确定),然后该结果值将用作函数的返回值。所以在myfunc
中,这是发生的事情的顺序:
try
块。x
(例如,获取x
的值)。finally
块。x
。因此,当我们离开函数时,即使x
为6
,返回值也是之前确定的。增加x
并不会改变它。
myfunc
中的代码与此类似:
int y = x;
x++;
在那里,我们读取 x
的值(就像return x
一样),将其分配给y
,然后递增x
。 y
不受该增量的影响。对于函数的返回值也是如此。
功能可能更清晰:假设foo
函数输出"foo"
并返回5,而bar
函数输出"bar"
,则此代码:< / p>
int test() {
try {
return foo();
}
finally {
bar();
}
}
...执行foo
,输出"foo"
,然后执行bar
,输出"bar"
,然后退出test
,返回值为{{1} }}。你不希望这个函数等到5
{<1}}之后发送foo
(这会很奇怪),实际上并不是这样:它在到达finally
语句时调用它,因为它会计算表达式return foo();
。 foo()
也是如此:它评估表达式并记住该语句的结果。
答案 1 :(得分:4)
最后块始终执行,但您在try
块本身中返回了值。在返回x
的值后,x
在finally
中递增。
public static int myfunc (int x) {
try {
return x; // returning
} finally {
x++; // now incremented.
}
}
注意:只是为了测试,如果你玩try-catch-finally
,最后返回(不推荐)并查看。
答案 2 :(得分:0)
最后执行无论什么,在这种情况下,值为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!
5
答案 3 :(得分:-1)
只是其他人的补充和蹩脚版本&#39;答案强>
让我们考虑以下这个例子:
public class ok {
public static int foo1(int x) {
try {
x++;
System.out.println("foo1 : Inside try before returning I am " + x);
return x;
} finally {
x++;
System.out.println("foo1 : Inside Finally after post Increment I am " + x);
}
}
public static int foo2(int x) {
try {
x++;
System.out.println("foo2 : I am inside another method, incremented and changed to " + x);
return x;
} finally {
}
}
public static void main(String[] args) {
ok o = new ok();
int val = 10; // The father of all
int z = foo1(val);
System.out.println("After executing foo1 I am " + z);
int x = foo2(val);
System.out.println("After executing foo2 I am " + x);
System.out.println("Inside main() and un-altered I am : " + val);
}
}
这只是一个示例程序,可以提高return
,try
,finally
的可理解性和同步性。然而,您还必须考虑事实,非常明显地提供:
谢谢,希望它有所帮助。
P.S: - 如果你觉得他们中的任何一个已经密切帮助或完全解决了你的问题,你也必须考虑接受答案
答案 4 :(得分:-2)
在x
块增加之前,myfunc()
的值已从finally
返回。