黑马程序员技术交流社区

标题: 测试题try中return执行在finally前还是后,我的答法有问题吗? [打印本页]

作者: 李工    时间: 2015-8-17 12:30
标题: 测试题try中return执行在finally前还是后,我的答法有问题吗?
本帖最后由 李工 于 2015-8-17 20:51 编辑

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







作者: 七了个七    时间: 2015-8-17 16:08
楼主好棒呀,我还是小白只能看看啦
作者: sven556677    时间: 2015-8-17 16:13
运行结果都出来了,不会有问题了吧。
作者: 巧克黑力    时间: 2015-8-17 16:23
看着像是可以的呢?
作者: 李工    时间: 2015-8-17 19:50
帖子沉的太快
作者: liuch111    时间: 2015-8-17 20:09
有问题 return后 没有语句,直接返回了!! 请问怎么证明呢 return中的语句先执行呢??
作者: 李工    时间: 2015-8-17 20:51
liuch111 发表于 2015-8-17 20:09
有问题 return后 没有语句,直接返回了!! 请问怎么证明呢 return中的语句先执行呢?? ...

return语句是后执行的啊

我想证明的是finally语句先执行。
作者: liuch111    时间: 2015-8-17 21:12
....


finally语句在return语句执行之后return返回之前执行的。
作者: liuch111    时间: 2015-8-17 21:14
本帖最后由 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. }
复制代码






作者: koibiki    时间: 2015-8-17 21:28
楼主可以运行下这个代码,这是传智风清扬老师的演示代码
  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中间的。
楼主可以参考下这个说法

作者: 李工    时间: 2015-8-17 21:46
koibiki 发表于 2015-8-17 21:28
楼主可以运行下这个代码,这是传智风清扬老师的演示代码

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

谢谢啊,你流程走到哪儿了?
作者: koibiki    时间: 2015-8-17 22:21
你看我都还是在赚技术分的小菜鸟,今天才刚给自荐信,也不知道能不能赶上月底的课了。
作者: groij    时间: 2015-8-18 22:01
liuch111 发表于 2015-8-17 21:14
下面代码能看明白 你基本上就懂了

但是,这可以说成如果return之后带上其他的可执行代码,就先执行吧。没有,就finaly。至于你说的return 30,要怎么证明,的确是先暂停呢?
作者: groij    时间: 2015-8-24 18:23
groij 发表于 2015-8-18 22:01
但是,这可以说成如果return之后带上其他的可执行代码,就先执行吧。没有,就finaly。至于你说的return 3 ...

什么??????




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2