黑马程序员技术交流社区

标题: try语句问题 [打印本页]

作者: uu993    时间: 2014-6-14 23:17
标题: try语句问题

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

作者: a6217815    时间: 2014-6-14 23:38
finally是必须执行的部分,try里的代码结束了,才是finally,所以return先执行,执行之后finally。
但是return放进try里面有没意义,因为感觉起不到什么作用。
作者: HKing    时间: 2014-6-14 23:42
这个问题真心好啊,我就只知道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. }
复制代码
结果:


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


作者: 心?=忐§忑]    时间: 2014-6-14 23:46
try
{
        //抛出异常
}
catch ()
{
        //处理异常
        return  ;
}
finally{
        //一定执行
}
/*
虽然return在先,但是在finally中是程序中一定执行的代码,
所以,即使这样,finally一样会被执行。
*/
作者: See_the_sun    时间: 2014-6-14 23:50
本帖最后由 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是在最后返回给方法。我的代码应该够简单了吧。你们运行下。

作者: 种一棵树    时间: 2014-6-14 23:56
前面的都解释的很清楚了,finally是一定会执行的,不会因为有return的存在就不执行。return后就直接跳到finally语句中开始执行。
但是有一个特殊情况是除外的,就是在遇到System.exit(0) 时,finally是执行不到的。这个也很好理解,虚拟机都退出了,当然是没有办法执行到finally语句了。


作者: See_the_sun    时间: 2014-6-14 23:57
HKing 发表于 2014-6-14 23:42
这个问题真心好啊,我就只知道finally里面的代码始终会执行而已,还真心不知道哪个先执行,故此写了个测试 ...

你的代码。还是不能明确temp的赋值是什么时候进行的。最好是直接输出字符串的测试方式。变量的方式。看不出来。
作者: HKing    时间: 2014-6-15 00:03
本帖最后由 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
finally 中的语句必然会执行,说明在函数结束前,执行。return 用来结束函数的,则finally 在return 语句前执行


作者: See_the_sun    时间: 2014-6-15 01:31
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:32
See_the_sun 发表于 2014-6-15 01:31
兄弟,我有点蒙了。。你执行下我的代码看看。你的代码我用Debug调试了。当中走了2次retrun,但是最后一次 ...

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

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

真心好啊,现在明白了~
作者: See_the_sun    时间: 2014-6-15 18:40
此贴不能沉。希望你们拿 1楼 和报纸那楼的代码 分别用Debug调试一边。然后总结下。希望你们能给出结论。到现在为止。此贴依旧存在2种观点。。还是没弄清楚。请后来者或者楼主总结清楚




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