黑马程序员技术交流社区
标题:
return与finally的问题
[打印本页]
作者:
张玉建
时间:
2013-8-7 11:27
标题:
return与finally的问题
class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
int test()
{
try
{
return func1();
}
finally
{
return func2();
}
}
int func1()
{
System.out.println("func1");
return 1;
}
int func2()
{
System.out.println("func2");
return 2;
}
}
/*
运行结果是
func1
func2
2
说明finally是在return后执行的,但finally一定会被执行完。*/
class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;//x=2
}
}
}/*
这里的运行结果是 1
finally在return后执行,++x不是2,x指向的是2,为什么是1呢?
中间出现了说明插曲!求大神解释!*/
作者:
黎志文
时间:
2013-8-7 11:53
try语句块中有return语句,会将返回值传递给try所在的函数,但是函数并不会马上就结束,因为finally里面的语句还要继续执行,所以:
1.第一种情况,首先执行try里面的语句,并将返回值1传递给test函数,函数未立即结束,继续执行finally中的语句,finally中还有return语句,那么此时又会将这里的返回值2传递给test函数,覆盖了原来的返回值1,函数运行到此结束,最终返回值为2;
2.第二种情况,try里面将返回值1传递给test函数,函数未结束,继续执行finally中的语句,x自增1,此时x=2,但是因为此时finally中并没有将自增后的x作为返回值传递给test函数,所以函数test最终的返回值就是try语句中的1,如果你在finally中这样处理:x先自增,然后再return x,那么此时函数test的返回值就会是2。
作者:
小发
时间:
2013-8-7 11:57
你的finally中的 ++x 虽然执行了,但是你finally中没有return 语句,得到的值没有返回给调用的呀
你在 ++x;后面加一句return x; 就能得到你想要的结果了。
作者:
张玉建
时间:
2013-8-7 12:10
有点明白,那就是主函数得到了是返回的x的值,
当finally执行,x自增了,但是并没又有去传递给主函数,导致运行结果是这样,
结合,内存中指向的变化,
我还有一个小问题,!就是int x=1,++x,在内存中是如何变幻的呢!
1是在常量池中,++x在堆内存中!
作者:
夜空闪亮
时间:
2013-8-7 22:42
本帖最后由 夜空闪亮 于 2013-8-7 22:43 编辑
张玉建 发表于 2013-8-7 12:10
有点明白,那就是主函数得到了是返回的x的值,
当finally执行,x自增了,但是并没又有去传递给主函数,导致 ...
函数的返回值是存放在栈空间中预先分配好的位置,一般就是调用函数的位置,你的第一个测试程序其实函数返回了两次值,先在try语句中返回fun1中的返回值1,但随后执行finally语句块时又将fun2中的返回值2返回了,覆盖了先前返回的1,所以所得的结果返回值是2,输出了2.而测试2中++x由于test方法是静态的,其内部x应该是在程序的静态区中,++x是在静态区中计算的,程序的返回值存储的地方跟++x存储的地方根本不在一个位置,所以x此时算出的结果并不会影响返回值的结果,除非你再将x返回。楼主其实可以在测试2代码中的++x后加上System.out.println(x),就会发现输出的结果就是2,说明x和函数的返回值确实存储不在同一个地方。
作者:
心灵之歌
时间:
2013-8-9 12:24
finally中的 ++x 虽然执行了,但是你finally中没有语句返回。
在 ++x;后面加一句return x; 就可以了。
主函数得到了是返回的x的值,
当finally执行,x自增了,但是并没又有去传递给主函数,导致运行结果是这样,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2