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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李工 于 2015-8-17 20:51 编辑

* 第7题: 用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行finally?
*       答:先执行finally.
*        如以下代码所示,finally里中的语句是打印一句话,try里的return是返回一个字符串.
*        而这段代码的运行结果是:
*                                                 执行到了finally
*                                                 执行到了return                  
*       可见,是先执行finally,后执行return                                                                     
*/






14 个回复

倒序浏览
楼主好棒呀,我还是小白只能看看啦
回复 使用道具 举报
运行结果都出来了,不会有问题了吧。
回复 使用道具 举报
看着像是可以的呢?
回复 使用道具 举报
帖子沉的太快
回复 使用道具 举报
有问题 return后 没有语句,直接返回了!! 请问怎么证明呢 return中的语句先执行呢??
回复 使用道具 举报
李工 中级黑马 2015-8-17 20:51:11
7#
liuch111 发表于 2015-8-17 20:09
有问题 return后 没有语句,直接返回了!! 请问怎么证明呢 return中的语句先执行呢?? ...

return语句是后执行的啊

我想证明的是finally语句先执行。
回复 使用道具 举报
....


finally语句在return语句执行之后return返回之前执行的。
回复 使用道具 举报
本帖最后由 liuch111 于 2015-8-17 21:15 编辑

下面代码能看明白 你基本上就懂了
  1. public class FinallyTest1 {

  2.     public static void main(String[] args) {
  3.         
  4.         System.out.println(test11());
  5.     }
  6.    
  7.     public static String test11() {
  8.         try {
  9.             System.out.println("try block");

  10.            return test12();
  11.       } finally {
  12.            System.out.println("finally block");
  13.        }
  14.   }

  15.   public static String test12() {
  16.        System.out.println("return statement");

  17.        return "after return";
  18.    }
  19.    
  20. }
复制代码





回复 使用道具 举报
楼主可以运行下这个代码,这是传智风清扬老师的演示代码
  1. class FinallyDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println(Demo());
  6.         }
  7.         public static int Demo()
  8.         {
  9.                 int a = 10;
  10.                 try
  11.                 {
  12.                         System.out.println(a/0);
  13.                         a = 20;
  14.                 }
  15.                 catch (ArithmeticException e)
  16.                 {
  17.                         a = 30;
  18.                         return a;
  19.                 }
  20.                 finally
  21.                 {
  22.                         a = 40;
  23.                 }
  24.                 return a;
  25.         }
  26. }
复制代码

根据这个代码可以看出return语句执行了两次,先形成了返回路径,但暂停了没有立即返回,此时a=30;然后执行finally,a赋值为40;然后再继续运行return语句,返回30。按照风老师的说法是finally语句是运行在return中间的。
楼主可以参考下这个说法
回复 使用道具 举报
koibiki 发表于 2015-8-17 21:28
楼主可以运行下这个代码,这是传智风清扬老师的演示代码

根据这个代码可以看出return语句执行了两次,先形 ...

谢谢啊,你流程走到哪儿了?
回复 使用道具 举报
你看我都还是在赚技术分的小菜鸟,今天才刚给自荐信,也不知道能不能赶上月底的课了。
回复 使用道具 举报
groij 中级黑马 2015-8-18 22:01:22
13#
liuch111 发表于 2015-8-17 21:14
下面代码能看明白 你基本上就懂了

但是,这可以说成如果return之后带上其他的可执行代码,就先执行吧。没有,就finaly。至于你说的return 30,要怎么证明,的确是先暂停呢?

点评

确定是问我?  发表于 2015-8-18 22:08
回复 使用道具 举报
groij 中级黑马 2015-8-24 18:23:38
14#
groij 发表于 2015-8-18 22:01
但是,这可以说成如果return之后带上其他的可执行代码,就先执行吧。没有,就finaly。至于你说的return 3 ...

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