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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?

2 个回复

正序浏览
   //调用下面的方法
            int n = fun(2);
             System.out.println("打印fun()函数返回的n值=  "+n);
     }
     public static int fun(int i)
     {
             try {
                     //发现异常
                    int m= i/0;
                     //异常直接被捕获,后面的不会执行。
                    return i++;
             }
             catch (ArithmeticException e){
                     System.out.println("异常信息:"+e);
                     System.out.println("catch 中的i = "+i);
                     return i+3;   //返回的是 2+3, 而不是finally中对i的赋值再来加上3,
                                        //finally中对i的操作,不会影响此时catch中的return i+3
             }
             finally  {
                     i++;
                     i++;
                     System.out.println("finally 执行  "+i);
                     //return i+8;   //如果这里没注释
                   //这里会返回12,而不会去返回catch中的  return i+3
             }
     }
}
/*        结论:          先执行return后执行finally
* 输出结果为:异常信息:java.lang.ArithmeticException: / by zero
*                                                catch 中的i = 2
*                                                finally 执行  4
*                                                打印fun()函数返回的n值=  5
* 结果分析:在执行try语句时,由于i/0是会报异常的,所以异常立马被catch捕获,for里面的return是不会执行的
*                                         执行catch语句内容,先输出两个语句,再执行return i+3;   此时i已经是5,所以主函数里面会打印n=5,
*                                         finally中对i的操作,不会影响此时catch中的return i+3
*                                         return执行完成后再执行finally,finally里面执行两次i++,所以输出的i值为4;
* 判断先后的方法:在finally里面加入了return i+8;  此时我们会发现主函数里面输出的是n=12,
*                                 如果是先执行的finally方法,catch里面的return 动作肯定会覆盖finally里面的,所以输出的肯定就不会是n=12
*                                 如果是先执行的try里面的return,输出的结果肯定就会被后来执行的finally方法所覆盖,输出就应该是n=12,满足代码结果
* 所以得出结论是:先执行的try里面的return  ,后执行的finally方法。
*/


//这是转帖,原帖地址:http://bbs.itheima.com/thread-129525-1-1.html
回复 使用道具 举报
先执行fianlly,但是值不会变,因为return已经将值准备好返回了,而fianlly用了也等于没用,不过也执行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马