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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© uu993 中级黑马   /  2014-6-14 23:17  /  1407 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


try {}里有一个return语句,那么紧跟在这个try后的 finally {}里的 code会不会被执行,  什么时候被执行,在return  前还是后?

15 个回复

倒序浏览
finally是必须执行的部分,try里的代码结束了,才是finally,所以return先执行,执行之后finally。
但是return放进try里面有没意义,因为感觉起不到什么作用。
回复 使用道具 举报
这个问题真心好啊,我就只知道finally里面的代码始终会执行而已,还真心不知道哪个先执行,故此写了个测试类,代码如下:
  1. import java.util.*;

  2. public class Test {

  3.         private static int temp = 0;

  4.     public static void main(String[] args) {
  5.         System.out.println("return返回temp的值:" + test());
  6.                
  7.                 System.out.println("整个test测试函数执行完后temp的值:" + temp);
  8.     }

  9.         public static int test()
  10.         {
  11.                 try
  12.         {
  13.                         System.out.println("try");
  14.                        
  15.                         return temp=temp+1;
  16.         }
  17.         catch (Exception e)
  18.         {
  19.                         System.out.println("catch");
  20.         }
  21.                 finally
  22.                 {
  23.                         System.out.println("执行到finally时temp的值:" + temp);
  24.                         temp = temp + 1;
  25.                 }
  26.                 return -1;
  27.         }
  28. }
复制代码
结果:


希望对你有所帮助。能力有限,有什么地方不正确的请指教!

评分

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

查看全部评分

回复 使用道具 举报 1 0
try
{
        //抛出异常
}
catch ()
{
        //处理异常
        return  ;
}
finally{
        //一定执行
}
/*
虽然return在先,但是在finally中是程序中一定执行的代码,
所以,即使这样,finally一样会被执行。
*/
回复 使用道具 举报
本帖最后由 See_the_sun 于 2014-6-15 01:31 编辑

class Test8{
        public static void main(String[] args) {
                System.out.println(method());
        }
        
        public static String method(){//返回类型是字符串。
        try{
               // show(1);
          System.out.println("try");
                return "执行return";
        }
        catch( RuntimeException e ){
                System.out.println("异常被捕获");
        }
        finally{
                System.out.println("总会被执行   ");
               
        }  
        return "代码结束";
        }

}   
//调试输出: 总会被执行,执行retrun 。。。//和上面不一样。return是在最后返回给方法。我的代码应该够简单了吧。你们运行下。
回复 使用道具 举报
前面的都解释的很清楚了,finally是一定会执行的,不会因为有return的存在就不执行。return后就直接跳到finally语句中开始执行。
但是有一个特殊情况是除外的,就是在遇到System.exit(0) 时,finally是执行不到的。这个也很好理解,虚拟机都退出了,当然是没有办法执行到finally语句了。

回复 使用道具 举报
HKing 发表于 2014-6-14 23:42
这个问题真心好啊,我就只知道finally里面的代码始终会执行而已,还真心不知道哪个先执行,故此写了个测试 ...

你的代码。还是不能明确temp的赋值是什么时候进行的。最好是直接输出字符串的测试方式。变量的方式。看不出来。
回复 使用道具 举报
HKing 中级黑马 2014-6-15 00:03:55
8#
本帖最后由 HKing 于 2014-6-15 00:06 编辑
See_the_sun 发表于 2014-6-14 23:57
你的代码。还是不能明确temp的赋值是什么时候进行的。最好是直接输出字符串的测试方式。变量的方式。看不 ...

可以明显看出是在return时赋值的好吧?要不temp的值为什么会变成1了呢?只有在return那里才有的temp+1。对吗?
回复 使用道具 举报
江祖贇 来自手机 中级黑马 2014-6-15 00:09:26
9#
finally 中的语句必然会执行,说明在函数结束前,执行。return 用来结束函数的,则finally 在return 语句前执行

回复 使用道具 举报
HKing 发表于 2014-6-15 00:03
可以明显看出是在return时赋值的好吧?要不temp的值为什么会变成1了呢?只有在return那里才有的temp+1。对 ...

兄弟,我有点蒙了。。你执行下我的代码看看。你的代码我用Debug调试了。当中走了2次retrun,但是最后一次return不赋值,遇到retrun。。貌似要看这个retrun中的某某关系。兄弟应该还有可以补充。我再看看
回复 使用道具 举报
See_the_sun 发表于 2014-6-15 01:31
兄弟,我有点蒙了。。你执行下我的代码看看。你的代码我用Debug调试了。当中走了2次retrun,但是最后一次 ...

我的代码也用Debug调试
回复 使用道具 举报
HKing 发表于 2014-6-15 00:03
可以明显看出是在return时赋值的好吧?要不temp的值为什么会变成1了呢?只有在return那里才有的temp+1。对 ...

我是这么猜的。第一次调用return 相对于整个方法来说已经结束了,所以返回为1.第二次调用是因为finally是在方法体内所以再次调用了。但是为什么值不会改变。要具体看看。不知道有没有其他高手能来解答下
回复 使用道具 举报
问的好,return在try里面就是多余的,有异常,默认就会跳出。但也分情况,如果没有出现异常你也return,我就不知道你什么心态了
回复 使用道具 举报
大哥  你自己试试呗
回复 使用道具 举报
uu993 中级黑马 2014-6-15 10:52:33
15#
HKing 发表于 2014-6-14 23:42
这个问题真心好啊,我就只知道finally里面的代码始终会执行而已,还真心不知道哪个先执行,故此写了个测试 ...

真心好啊,现在明白了~
回复 使用道具 举报
此贴不能沉。希望你们拿 1楼 和报纸那楼的代码 分别用Debug调试一边。然后总结下。希望你们能给出结论。到现在为止。此贴依旧存在2种观点。。还是没弄清楚。请后来者或者楼主总结清楚
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马