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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© YaYa 高级黑马   /  2015-9-22 20:19  /  1796 人查看  /  27 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答案:很多人都说是在return前执行,更细致的说是在return中间执行

求解释,不懂  我认为是前!o(︶︿︶)o 唉

27 个回复

倒序浏览
自己写个代码做个实验就好
回复 使用道具 举报
看以下代码
  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
回复 使用道具 举报 1 0
先finally 后return; 如果catch到了异常只有finally,return 不执行
回复 使用道具 举报
大大大卷 发表于 2015-9-23 08:48
看以下代码

输出结果是

x[20] 的时候下面两句根本没有执行
System.out.println("return late");
                        return 0;
回复 使用道具 举报
芝麻糊 发表于 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:21
7#
大大大卷 发表于 2015-9-23 08:48
看以下代码

输出结果是

其实我想问一下  。。。。你介样的代码格式怎么发的
回复 使用道具 举报
大大大卷 发表于 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.         }
复制代码

哪里编译不过?
回复 使用道具 举报
学习了 以后有用
回复 使用道具 举报
学习了。。。。。。。。。。。
回复 使用道具 举报

他的代码是通不过的  因为他的代码 函数需要一个int 返回值,如try语句出现异常,try中的return 可能会执行不到,所以编译器强行要求必须有一条rerurn被执行,所以在catch或者finally至少得有一个return
回复 使用道具 举报
面试的话答前就可以了,答中间的话,面试官可能会让你好好解释一下了
回复 使用道具 举报
路过学习了,我还没看异常
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
YaYa 发表于 2015-9-24 15:09
其实我想问一下  。。。。你介样的代码格式怎么发的

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

回复 使用道具 举报
大大大卷 发表于 2015-9-23 12:18
事实上,如果你把return放在try语句里的话,而finally里没有return
是根本通不过编译的

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

...

谢谢!!!!!!!!!!!
回复 使用道具 举报
finally是在return前执行的,如果想要了解,去看看老毕的视屏关于异常那一部分,有解释的。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马