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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李红亮 中级黑马   /  2013-12-5 12:52  /  3067 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李红亮 于 2013-12-5 22:20 编辑

在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?

17 个回复

倒序浏览
本帖最后由 sd110572 于 2013-12-5 13:19 编辑

因为在执行return之前它会检查一下后面是否有finally,没有就直接返回,有就先执行finally再返回
回复 使用道具 举报
谢谢你的提醒,(*^__^*) ,能够写个简单的代码证明下吗
回复 使用道具 举报
sd110572 发表于 2013-12-5 13:03
因为在执行return之前它会检查一下后面是否有finally,没有就直接返回,有就先执行finally再返回 ...

谢谢你的提醒,(*^__^*) ,能帮我写个简单点的代码证明一下吗
回复 使用道具 举报
这是基础测试题的其中一题,不知道是否相同
这是我的解答供你参考
  1. /*
  2. * 6: 用代码证明
  3. * 在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
  4. *
  5. * 思路与步骤
  6. * (1)定义一个返回int类型的方法checkMethod(),在方法里定义一个int i = 1;
  7. * (2)try里面写入return ++i;
  8. * (3)finally里面为i = 5;为i赋值为5
  9. * (4)根据主函数里的输出值判断try、finally的执行顺序
  10. *                 如果是先执行return ++i,那么应该先得到返回i值,i值为2,再执行finally的i赋值语句
  11. * 但是此时已经不能影响return的i值了,所以输出为2
  12. *                 如果是先执行finally的i赋值语句,那么此时i=5,再执行try的return ++i;那么返回值
  13. * 是6,说以输出为6
  14. *
  15. * 验证结果:输出:2
  16. * 所以先执行return 再执行finally
  17. *
  18. * */
  19. public class Test6 {

  20.         /**
  21.          * @param args
  22.          */
  23.         public static void main(String[] args) {
  24.                 System.out.println(checkMethod());
  25.         }
  26.         public static int checkMethod()
  27.         {
  28.                 int i = 1;
  29.                 try {
  30.                         // TODO Auto-generated method stub
  31.                         return ++i;//如果先执行,那么返回值是2,如果后执行,返回值是6
  32.                 } catch (Exception e) {
  33.                         // TODO: handle exception
  34.                 }finally{
  35.                         i = 5;
  36.                 }
  37.                 return i;
  38.         }

  39. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
谢谢,你流程走到那了?
回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-12-5 13:28
这是基础测试题的其中一题,不知道是否相同
这是我的解答供你参考

谢谢,你流程走到那了?
回复 使用道具 举报
李红亮 发表于 2013-12-5 13:29
谢谢,你流程走到那了?

流程已经走完了...现在在忙点别的事
回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-12-5 13:31
流程已经走完了...现在在忙点别的事

前面的你都拿了多少分?我刚交了自荐信,下载了测试题,不知道能不能赶上28
回复 使用道具 举报
本帖最后由 sd110572 于 2013-12-5 13:35 编辑

  1. <P>                int i = 2;
  2.                 try{
  3.                         if(1==i){
  4.                                 System.out.println("i==1");</P>
  5. <P>                         return ;
  6.                         }
  7.                         else{
  8.                                 System.out.println("i==其他");
  9.                                 return ;
  10.                         }
  11.                 }
  12.                 catch(Exception e){
  13.                         e.printStackTrace();
  14.                 }
  15.                 finally{
  16.                         System.out.println("不论如何都执行finally");
  17.                 }</P>
复制代码
回复 使用道具 举报
谢啦,你打算报那期的,28吗?能加个QQ么,我的846868338,验证码答案是  李红亮
回复 使用道具 举报

谢啦,你打算报那期的,28吗?能加个QQ么,我的846868338,验证码答案是  李红亮
回复 使用道具 举报
李红亮 发表于 2013-12-5 13:33
前面的你都拿了多少分?我刚交了自荐信,下载了测试题,不知道能不能赶上28

必须能啊,这还有十几天,加油了,除开面试,一共扣了2.6
回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-12-5 13:28
这是基础测试题的其中一题,不知道是否相同
这是我的解答供你参考

可不可以这样理解呢!
return是在finally执行后才返回的,且finally无法改变返回值。
回复 使用道具 举报
Jim-剣◆﹏ 发表于 2013-12-5 13:42
必须能啊,这还有十几天,加油了,除开面试,一共扣了2.6

厉害.那你差不多算是百分百能进了(*^__^*)
回复 使用道具 举报
这个很特别先finally然后return
回复 使用道具 举报
本帖最后由 Jim-剣◆﹏ 于 2013-12-5 15:05 编辑
张天昊76 发表于 2013-12-5 13:48
可不可以这样理解呢!
return是在finally执行后才返回的,且finally无法改变返回值。 ...

其实这样说不太准确,但是不能说错了
我来说说内部的实现吧
其实在执行返回的时候,专门有一个栈队列存储需要返回的动作和结果(先进后出)
当执行到return这句的时候,把++i这句给执行了,但是return这个动作没执行,而是把返回这个动作和具体值放入栈内(此时放入的是栈的底部)
然后再执行finally中的i赋值语句,“=”赋值动作也未执行,并也放入栈内(此时放在return的上方)

等搜有语句完成入栈后,会进行出栈操作,出栈操作才会具体执行语句的返回和赋值动作
出栈的顺序是先进后出
先执行的是finally中i的“=”赋值动作,但是此时return在栈中的值已经是以一个常量的形式存在不是i变量的形式,所以finally中的i赋值语句不能影响return的值
再执行return语句中的返回动作
所以...还是画个图比较清晰,讲了不知道明不明白



回复 使用道具 举报
先执行finally,如果finally语句里没有return,再执行try里的return
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马