黑马程序员技术交流社区
标题:
关于try中return 的一点小问题。求高手详解。谢谢。
[打印本页]
作者:
一碗小米周
时间:
2014-1-3 20:11
标题:
关于try中return 的一点小问题。求高手详解。谢谢。
本帖最后由 一碗小米周 于 2014-1-4 13:30 编辑
public class Test4 {
public static void main(String[] args) {
System.out.println(Test4.Ret());
}
public static int Ret(){
int a=10;
try{
return a;
}
finally{
a=a+10;
System.out.println("s");
}
}
}
复制代码
我上网查了一下资料,当try中有return时,是先执行finally里的语句的,再执行try中的return。那么在finally中a会变成20,那么try中的return a 为什么没有改变呢?求高手详解呀。谢谢。
作者:
快乐的黑马
时间:
2014-1-3 20:31
同学你好,你这问题很有意思,我刚刚测试了下,发现返回来的a竟然没变!!!按我的理解可能是:
finally
{
//除了退出程序一定会执行的语句,是最后!注意!!是最后执行的语句,在你上述是单线程中,a先被赋予10,再后面执行finally语句是不会再重新给a赋值。
}
希望对你有用,我也是在学习中,争取早日去黑马{:soso_e112:}
作者:
黑马IT学员
时间:
2014-1-3 20:32
这个是先执行return语句的后执行finally语句,你可以看看这个帖子
http://bbs.itheima.com/thread-104385-1-1.html
作者:
黑马IT学员
时间:
2014-1-3 20:35
执行结果是中可以清晰的看出来:
QQ截图20140103203334.png
(6.96 KB, 下载次数: 9)
下载附件
2014-1-3 20:34 上传
作者:
其LovE斤
时间:
2014-1-3 21:07
int a=10;
try{
return a; //在这里 你return的时候 在编译器看来 你的要返回的值已经确定了。就是10。
//你要传出去的数值已经确定了。已经处于了传递的状态,再修改a也只是修改的a的值,不是传递出去的值。
}
finally{
a=a+10; //在这里 你确实是改变了a的值,a变为了20.但是注意,当finally执行完就走出了方法的大括号,就是你的a就被内存释放了。
//a都被释放了。你的a的值,到底是什么?
System.out.println("s"); //你在你这里 改为 System.out.println("s"+a);就会发现a确实改变了。
}
作者:
一碗小米周
时间:
2014-1-3 21:25
我觉着,那个finally中的语句应该是在return中间执行的。那个return是先把返回值存放到栈中,然后执行finally中的语句,最后返回那个栈中的值。。又不对的地方望指正。
作者:
悠然的我
时间:
2014-1-3 23:09
不要纠结这里,看看我的代码
public class Main
{
public static void main(String[] args)
{
System.out.println("ret:"+Ret().getAge());
}
public static Person Ret()
{
Person p = new Person();
try
{
p.setAge(25);
return p;
}
finally
{
p.setAge(30);
System.out.println("finally:"+p.getAge());
}
}
}
class Person
{
private int age;
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
执行结果如下:
finally:30
ret:30
这就是你想到的结果吧。你用基本数据类型或使用String类型操作都是不靠谱的,因为你代码里a的引用指向了不同的内存地址,finally操作的数据跟你要返回的数据根本就不是一个,所以finally怎么搞跟你返回值都没有关系的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2