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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肖发腾 中级黑马   /  2012-3-29 19:59  /  2690 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class  smallT
{
        public static void  main(String args[])
        {
                smallT t  = new  smallT();
                int  b  =  t.get();
                System.out.println(b);
        }
       
        public int  get()
        {
                try
                {
                        return 1 ;
                }
                finally
                {
                        return 2 ;
                }
        }
}


结果返回的是2,为什么?

10 个回复

倒序浏览
本帖最后由 龚龙 于 2012-3-29 20:26 编辑

因为finally里面的代码始终会执行到,
然而return 1也执行到了,只是返回1的值被finally返回2的值覆盖了.
就是说,你的b值首先是1,然后是2,所以打印出2.
回复 使用道具 举报
哦。。。知道了。。。
回复 使用道具 举报
捕捉异常中,不管有没有发生异常,finally中的代码是一定会被执行的语句。
所以,最终返回的值是return 2;


我有一点小疑问:你为什么要写下面这一句?
smallT t  = new  smallT();
回复 使用道具 举报
杨华威 发表于 2012-3-29 20:32
捕捉异常中,不管有没有发生异常,finally中的代码是一定会被执行的语句。
所以,最终返回的值是return 2; ...

产生对象进行调用
回复 使用道具 举报
其实是 同时返回的 并没有先后 至于为什么我也不知道 张孝祥老师有讲过这道题目
回复 使用道具 举报
哦。。。。
回复 使用道具 举报
就是验证finally语句块中的代码一定执行而已
回复 使用道具 举报
通过实验总结:

这个机制是这样的---碰到try语句中的return,那么先把return的值放在某个池中,然后执行finally里面的代码块,

如果有返回值覆盖语句,就改变先前放在池中的那个值,如果没有,就把那个池中的东西取出来返回出去

class Test
{
        public static void main(String[] args)
        {
                System.out.println(test());
        }

        public static int test()
        {
                int x = 10;

                try
                {
                        return x;
                }
               
                finally
                {
                                      //x+=2;            //结果返回10---->没有return,不改变返回值
                        return x+=2;  //结果返回12---->有return,执行覆盖
                }
        }
}
回复 使用道具 举报
捕捉异常中,不管有没有发生异常,finally中的代码是一定会被执行的语句。
所以,最终返回的值是return 2;
回复 使用道具 举报
finally最后总是要执行的,除非执行了System.exit()或者是finally里面也出现了异常
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马