黑马程序员技术交流社区
标题:
finally和return小问题
[打印本页]
作者:
光脚丫的小白兔
时间:
2013-10-8 21:44
标题:
finally和return小问题
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呢?
中间出现了说明插曲!求大神解释!*/
作者:
doitforyou
时间:
2013-10-8 22:30
在程序执行期间,try执行后返回一个结果,这个结果会暂时存放在栈空间,
然后程序继续回来执行finally代码块,所以你第二个程序中虽然finally中有++x,
但是此时返回值已经在栈空间了,不存在指向问题,java中是传值运算。
第一个估计你也知道为什么了,因为你finally中又返回了一个值,将原本的返回值就覆盖掉了。
希望能帮到你,因为我也不是大神,只能理解到这里了。
作者:
黑马戴帅军
时间:
2013-10-8 22:38
本帖最后由 黑马戴帅军 于 2013-10-8 22:47 编辑
try中的return的返回值是固定的,只要执行到了这个代码,他就产生了固定的返回值。
finally中是一定会被执行的代码块,这也没有错。但是
finally
{
++x;//x=2
这段代码对x只进行了先+1运算,并没有对x的值进行打印或者return。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
System.out.println("finally:"+x);
}
}
}
输出的结果是:finally:2
1
说明了finally中的代码一定会执行,而且先于try中的return语句。
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
System.out.println("finally:"+x);
return x;
}
}
}
输出的结果是finally:2
2
在finally中写入return语句以后,会覆盖try中的return语句。
希望对楼主有帮助。
作者:
To
时间:
2013-10-9 08:44
如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
作者:
狼人→浪人
时间:
2013-10-9 09:05
class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
System.out.println("try中的x:"+x);
return x;//当程序遇到return时,把 x=1装载到 return这辆车上。准备开走,但是要让finally先开走
}
finally
{
++x;// 可是finally把x改变了,(x=2,但是return那辆车上还是装x=1)finally执行完内存里面的值改变,返回的值不变
System.out.println("finally中的x:"+x);//x=2
}
}
}
总结:finally先于return执行,但是return返回的是finally执行之前的值。我觉得用上面的小例子比较容易理解。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2