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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马戴帅军 中级黑马   /  2013-9-27 17:04  /  2000 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马戴帅军 于 2013-9-28 12:15 编辑

用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
这个题的题意不太明白。用不用考虑finally中写入ruturn的情况呢。提交的时候要不要考虑这个种情况。本来想把我的测试方法贴出来,但是想想还是算了。回答问题的也不要贴代码。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

7 个回复

倒序浏览
try区块只是表示其后面的一对大括号{}的内容,你说的那种情况我觉得有点没有多大意义,return后面是不能再跟其他语句的,跟了也没法执行。希望能帮到你。
回复 使用道具 举报
个人觉得还是按题意来写代码
回复 使用道具 举报
这道题可以用断点来逐步查看运行步骤,如果用代码的话,利用求和的函数,调用方法,返回求和的值,然后通过打印出的顺序可以知道try中的return先执行还是finally先执行。由打印结果可以知道如果try中有return的话finally会先执行然后再返回值,但是finally无法改变返回值。如果return在finally中也有的话将始终返回finally中的return值。
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 //定义三个加数
  4.                 int x = 2;
  5.                 int y = 3;
  6.                 int z = 1;
  7.                
  8.                 //调用try中有return的函数
  9.                 System.out.println("main sum = " +sumMethod1(x,y,z));
  10.                
  11.                 System.out.println("------------------------------");
  12.                
  13.                 //调用try和finally中都有return的函数
  14.                 System.out.println("main sum = " +sumMethod2(x,y,z));
  15.         }

  16.         private static int sumMethod1(int x, int y,int z) {
  17.                 //定义一个和数
  18.                 int sum;
  19.                 try {
  20.                         sum = x + y;
  21.                         //打印出try里的和数
  22.                         System.out.println("try sum = "+ sum);
  23.                         //将求和的数返回
  24.                         return sum;
  25.                 } finally{
  26.                         //重定义求和的数
  27.                         sum = x+z;
  28.                         //打印出finally里的和数
  29.                         System.out.println("finally sum = "+ sum);
  30.                 }
  31.         }

  32.         private static int sumMethod2(int x, int y,int z) {
  33.                 //定义一个和数
  34.                 int sum;
  35.                 try {
  36.                         sum = x + y;
  37.                         //打印出try里的和数
  38.                         System.out.println("try sum = "+ sum);
  39.                         //将求和的数返回
  40.                         return sum;
  41.                 } finally{
  42.                         //重定义求和的数
  43.                         sum = x+z;
  44.                         //打印出finally里的和数
  45.                         System.out.println("finally sum = "+ sum);
  46.                         //返回求和的sum
  47.                         return sum;
  48.                 }
  49.         }
  50. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
你在try 里面return    这个作用范围只在这个括号里面,  而  finally  会继续执行
回复 使用道具 举报
复制代码

1 public     class     Test {   public      static      void      main(String[]      args) {        System.out.print(tt());   }   public      static      int      tt() {        int      b      =      23;        try      {         System.out.println("yes");         return      b+=88;        }        catch(Exception      e)      {         System.out.println("error      :      "      +      e);        }        finally      {         if(b>25)       {          System.out.println("b>25      :      "+b);         }         System.out.println("finally");        }      return      b;   } }

复制代码





    代码说明:

     主要是用来测试return和finally语句到底哪个先执行.在try语句中,返回了b=111; 在finally语句中判断是否大于25,如果大的话就输出大..程序的结果是

yes

b>25       :       111

finally

111

    也就是说明finally语句在return语句执行完了以后才执行的.

     OK,那么问题来了,如果我把finally语句改成这样呢:



1 finally      {         if(b>25)       {          System.out.println("b>25      :      "+b);         }         System.out.println("finally");  
2
3      return 100;      }



            也就是在finally中加入return 语句,返回不同的值. 那么,返回值到底是原来的b值(111),还是新的这个返回值呢? 废话不多,看结果:

yes

b>25       :       111

finally

100

     这样又说明了一个问题,finally语句块里面的return把原来的return给覆盖了!!变成了新的返回值了.

     OK,继续闷骚:我把代码改成这样:

try      {         System.out.println("yes");         return      b;        }        catch(Exception      e)      {         System.out.println("error      :      "      +      e);        }        finally      {         if(b>25)       {          System.out.println("b>25      :      "+b);         }         System.out.println("finally");         b=100;      }



           也就是把 try中的返回语句改成返回b值,然后在finally中改变b的值. 那么返回结果到底是原来的b值呢, 还是更改过的b值呢?结果如下:

yes

finally

23

      说明了一个问题,如果finally语句中没有返回语句覆盖的话,那么原来的返回值就不会变,不管你是不是改变了要返回的那个变量.

      最后还是来说说一点点想法,这个机制是不是这样的呢?碰到try语句中的return,那么先把return的值放在某个池中(怎么我也说起池来了,明明根本还不懂的)?      然后执行finally里面的代码块,如果有返回值覆盖语句,就改变先前放在池中的那个值,如果没有,就把那个池中的东西取出来返回出去


如果在try-finally外面在用一个return返回一个值会不会改变在try里面的返回的那个值呢? 代码如下: public  static  void main(String[] args)     {            System.out.print(tt());       }       public static int tt()     {            int b = 23;            try          {             System.out.println("yes");             return  b =88;            }            catch(Exception      e)          {             System.out.println("error : "             e);            }            finally          {             if(b>25)           {              System.out.println("b>25 : " b);             }             System.out.println("finally");            }          return  100;       }
结果是: yes b>25 : 111 finally 111 答案是不会的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
卓瑶 中级黑马 2013-9-28 09:30:43
7#
不管怎样都是先执行try里面的语句,如果try中有return就先执行然后在执行finally中的语句,而不会执行catch中的语句。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
先执行return 通过可以myeclipse进行断点测试
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马