黑马程序员技术交流社区

标题: 还是面试题!o(︶︿︶)o 唉 [打印本页]

作者: YaYa    时间: 2015-9-22 20:19
标题: 还是面试题!o(︶︿︶)o 唉
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答案:很多人都说是在return前执行,更细致的说是在return中间执行

求解释,不懂  我认为是前!o(︶︿︶)o 唉
作者: yi秒的危笑    时间: 2015-9-23 08:22
自己写个代码做个实验就好
作者: 大大大卷    时间: 2015-9-23 08:48
看以下代码
  1. package cn.itheima.bbs.problem;

  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 // TODO 自动生成的方法存根
  5.                 int x = test();
  6.                
  7.                 System.out.println("return");
  8.         }

  9.         public static int test() {
  10.                 // TODO 自动生成的方法存根
  11.                 int[] x = new int[5];
  12.                
  13.                 try{
  14.                         x[20] = 10;
  15.                         System.out.println("return late");
  16.                         return 0;
  17.                 }
  18.                 catch(ArrayIndexOutOfBoundsException e){
  19.                        
  20.                         System.out.println("catch语句被执行");
  21.                 }
  22.                 finally{
  23.                         System.out.println("finally语句被执行了");
  24.                         return 10;
  25.                 }
  26.         }
  27.        
  28.        

  29. }
复制代码

输出结果是
  1. catch语句被执行
  2. finally语句被执行了
  3. return
复制代码

当用x[20]时输出是这样的

当用x[2]时,是这样的
  1. return late
  2. finally语句被执行了
  3. return
复制代码


可以看出,无论是否catch到异常,都是先finally 在return
作者: 芝麻糊    时间: 2015-9-23 10:45
先finally 后return; 如果catch到了异常只有finally,return 不执行
作者: 芝麻糊    时间: 2015-9-23 10:47
大大大卷 发表于 2015-9-23 08:48
看以下代码

输出结果是

x[20] 的时候下面两句根本没有执行
System.out.println("return late");
                        return 0;
作者: 大大大卷    时间: 2015-9-23 12:18
芝麻糊 发表于 2015-9-23 10:47
x[20] 的时候下面两句根本没有执行
System.out.println("return late");
                        return ...

事实上,如果你把return放在try语句里的话,而finally里没有return
是根本通不过编译的

所以是这样,要么就把return放在finally里,要么就不要try,只抛

这样执行流程就清楚了吧,
必然是先执行finally再return,
像我上面的代码,其实只有finally语句里的return才执行了,无论有没有异常,总是执行finally里的return
楼主的题也是自己没有想过就来问了,


作者: YaYa    时间: 2015-9-24 15:09
大大大卷 发表于 2015-9-23 08:48
看以下代码

输出结果是

其实我想问一下  。。。。你介样的代码格式怎么发的
作者: 芝麻糊    时间: 2015-9-24 22:40
大大大卷 发表于 2015-9-23 12:18
事实上,如果你把return放在try语句里的话,而finally里没有return
是根本通不过编译的
  1. public static void main(String[] args) {               
  2. //                System.out.println(test());
  3.                 int[] i = new int[2];
  4.                 try {
  5.                         int x = 1;
  6.                         i[x] = 5;
  7.                      
  8.                         return ;                        
  9.                         
  10.                 } catch(Exception e) {
  11.                         
  12.                         System.out.println("catch执行");
  13.                         
  14.                 } finally {
  15.                         System.out.println("finally执行");
  16.                 }
  17.                
  18.                
  19.         }
复制代码

哪里编译不过?
作者: 呵呵哒    时间: 2015-9-24 23:23
学习了 以后有用
作者: ln0491    时间: 2015-9-24 23:27
学习了。。。。。。。。。。。
作者: fmi110    时间: 2015-9-25 07:49
芝麻糊 发表于 2015-9-24 22:40
哪里编译不过?

他的代码是通不过的  因为他的代码 函数需要一个int 返回值,如try语句出现异常,try中的return 可能会执行不到,所以编译器强行要求必须有一条rerurn被执行,所以在catch或者finally至少得有一个return
作者: 沙鹰    时间: 2015-9-25 08:41
面试的话答前就可以了,答中间的话,面试官可能会让你好好解释一下了
作者: 不隆卡    时间: 2015-9-25 09:42
路过学习了,我还没看异常
作者: 920792433    时间: 2015-9-25 10:06
  1. public class ExceptionDemo
  2. {
  3.        
  4.         public static void main(String[] args)
  5.         {
  6.                 /**
  7.                  *        如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。
  8.                  *        会执行,在return前
  9.                  */
  10.                 System.out.println(getInt());

  11.         }
  12.        
  13.         public static int getInt()
  14.         {
  15.                
  16.                 int a = 23 ;
  17.                
  18.                 try
  19.                 {
  20.                         System.out.println(a / 0 );
  21.                         a = 45 ;
  22.                 }
  23.                
  24.                 catch (Exception e)
  25.                 {
  26.                         a = 60 ;                       
  27.                         return a ;                        // 赋值完毕以后返回路径已经形成了这个时候a的值就是60 , 但是发现存在finally语句,
  28.                                                                 // 于是就执行了一次finally然后继续返回 , 所以finally的执行在return中间
  29.                 }
  30.                 finally
  31.                 {
  32.                         a = 70 ;
  33.                         return a ;        //70
  34.                 }
  35.                
  36.         //        return a;             //60
  37.                
  38.         }

  39. }
复制代码

作者: 安仔    时间: 2015-9-25 11:13
YaYa 发表于 2015-9-24 15:09
其实我想问一下  。。。。你介样的代码格式怎么发的

回复主题的时候文本框右上有个高级模式,点开之后,在编辑栏上面找到   <>   的图标就可以添加代码了


作者: DD_vincent    时间: 2015-9-25 11:19
大大大卷 发表于 2015-9-23 12:18
事实上,如果你把return放在try语句里的话,而finally里没有return
是根本通不过编译的

你这个说的有点武断了,如果函数没有返回值的话,在try语句中加入return只是终止的作用,不是返回一个值。那么加到try里,或者finally里都无所谓。
而如果有返回值的话,就要考虑到try语句中代码被中断,无法返回值。这时候起始在catch语句而不是finally中加入return也是可以通过编译的
作者: DD_vincent    时间: 2015-9-25 11:21
顺便提一句,不论try和catch语句中的代码是怎样的,finally中的代码都会执行。除非在try或者catch语句中直接加入了exit()代码直接退出JVM。
也就是说,不论try或catch语句中加入了怎样的控制流程的代码(break、continue),finally语句中的代码都会先于这些控制流程的代码执行
作者: Yingwenming    时间: 2015-9-25 11:55
楼上说的对
作者: YaYa    时间: 2015-9-25 19:51
安仔 发表于 2015-9-25 11:13
回复主题的时候文本框右上有个高级模式,点开之后,在编辑栏上面找到      的图标就可以添加代码了

...

谢谢!!!!!!!!!!!
作者: 达达达    时间: 2015-9-25 21:54
finally是在return前执行的,如果想要了解,去看看老毕的视屏关于异常那一部分,有解释的。
作者: iceknc    时间: 2015-9-25 22:16
又涨姿势了
作者: 芝麻糊    时间: 2015-9-25 22:26
fmi110 发表于 2015-9-25 07:49
他的代码是通不过的  因为他的代码 函数需要一个int 返回值,如try语句出现异常,try中的return 可能会执 ...

为什么非的在catch或者finally中, 写在finally外面不行吗 。。
作者: 芝麻糊    时间: 2015-9-25 22:29
DD_vincent 发表于 2015-9-25 11:21
顺便提一句,不论try和catch语句中的代码是怎样的,finally中的代码都会执行。除非在try或者catch语句中直 ...

值得学习
作者: qiaozengji668    时间: 2015-9-25 22:56
顶一下!!!
作者: xuxu5112    时间: 2015-9-25 23:03
本帖最后由 xuxu5112 于 2015-9-25 23:12 编辑

执行到return 的时候 会创建一个临时的空间把数据存在里面  
再检查是否有finally 如果有就执行 finally里中的语句
执行结束后把 临时空间内存放的数据 return所以严格来说 确实是在return 中 执行的.

作者: fmi110    时间: 2015-9-25 23:21
芝麻糊 发表于 2015-9-25 22:26
为什么非的在catch或者finally中, 写在finally外面不行吗 。。

可以,只要确保能有一个return被执行到就行
作者: 大漠孤星    时间: 2015-9-26 00:25
原来是这样啊!!!!!!!!!!!!!!!!!!!!!
作者: sfgjys    时间: 2015-9-26 00:32
finally的特性就是在jvm不停机的情况下绝对会执行,所以执行顺序就是在将要出去前和已经出去后了,也就是执行return之间




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