A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一碗小米周 于 2014-1-4 13:30 编辑

  1. public class Test4 {
  2.         public static void main(String[] args) {
  3.                 System.out.println(Test4.Ret());
  4.         }
  5.         public  static int Ret(){
  6.                 int a=10;
  7.                 try{
  8.                         return a;
  9.                 }
  10.                 finally{
  11.                         a=a+10;
  12.                         System.out.println("s");
  13.                 }
  14.         }
  15. }
复制代码
我上网查了一下资料,当try中有return时,是先执行finally里的语句的,再执行try中的return。那么在finally中a会变成20,那么try中的return a 为什么没有改变呢?求高手详解呀。谢谢。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

6 个回复

倒序浏览
同学你好,你这问题很有意思,我刚刚测试了下,发现返回来的a竟然没变!!!按我的理解可能是:
finally
{
    //除了退出程序一定会执行的语句,是最后!注意!!是最后执行的语句,在你上述是单线程中,a先被赋予10,再后面执行finally语句是不会再重新给a赋值。
}

希望对你有用,我也是在学习中,争取早日去黑马{:soso_e112:}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
这个是先执行return语句的后执行finally语句,你可以看看这个帖子
http://bbs.itheima.com/thread-104385-1-1.html
回复 使用道具 举报
执行结果是中可以清晰的看出来:

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
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确实改变了。
      }

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
我觉着,那个finally中的语句应该是在return中间执行的。那个return是先把返回值存放到栈中,然后执行finally中的语句,最后返回那个栈中的值。。又不对的地方望指正。
回复 使用道具 举报
不要纠结这里,看看我的代码
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怎么搞跟你返回值都没有关系的。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马