黑马程序员技术交流社区

标题: 在做一道基础测试题,发现的一个问题 [打印本页]

作者: 路西法    时间: 2014-4-1 12:35
标题: 在做一道基础测试题,发现的一个问题
用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?

我写的是 public static void main(String[] args) {
       

        System.out.println(tryReturn());//直接输出tryReturn运行结果

}       

public static int tryReturn() {
       
        int count= 3;//定义一个计数器
        try{
                System.out.println(count);
                return ++count;        //由此判断
        } finally{
                System.out.println("finally已经被执行并且计数器是:"+(++count));
                /*//return ++count;本来想在这也返回个值的,
                但是如果在finally语句中包涵return则系统不
                会跳回try块中但是这也侧面证明try中的return
                是在finally语句之后执行*/
        }

}


输出结果是             3
                                finally已经被执行并且计数器是:5
                                4
                                       
        发现有趣的地方:当在finally块里面的输出语句中加个++count         时,我们会发现return确实是在finally之后返回值                                        但是return中的的count却比finally中的count的先自加  这时为什么呢?

作者: osully    时间: 2014-4-1 12:38
return 是用来结束函数用的....
可想而知 函数都结束了 还finally?????
作者: 还是回去火星吧    时间: 2014-4-1 12:53
我也有这道题,我自己觉得,因为finally是函数中必须执行的语句块,所以当finally还没执行的时候,所有被执行过的变量和语句块都存于内存中。
作者: 黄晓鑫    时间: 2014-4-1 12:55
我只知道finally是一定要执行的语句块 比return先执行 除非遇到System.exit(0);
作者: 心?=忐§忑]    时间: 2014-4-1 14:54
return ++count;我觉得关键语句是这,看两个加号在前面还是在后面。
作者: 路西法    时间: 2014-4-1 23:28
黄晓鑫 发表于 2014-4-1 12:55
我只知道finally是一定要执行的语句块 比return先执行 除非遇到System.exit(0);

我也知道finally比try中的return先执行  但是看上面的计数器  为什么return的count 比finally中的 先先执行

作者: Engle    时间: 2014-4-1 23:54
个人看法:
当try语句后面有finally时,finally语句一定会执行(排除虚拟机崩溃或者System.exit(0);)
java 的方法中代码一般而言是自上而下执行的,遇到return 语句肯定就不会再往下执行了。
注意:finally代码块内容是最终都会执行,它强调的是无论是否有异常产生,它和try不是一个代码块的内容,所以不能把它看成是return下面的代码。
所以在这种情况下,java代码只能先执行finally语句后再return。
作者: 肖涵    时间: 2014-4-2 17:28
public static void main(String[] args) {
        

        System.out.println(tryReturn());

}        

public static int tryReturn() {
        
        int count= 3;
        try{
                System.out.println(count);
                return ++count;
        }
finally{
                System.out.println("finally已经被执行并且计数器是:"+(++count));
                /*//return ++count;本来想在这也返回个值的,
                但是如果在finally语句中包涵return则系统不
                会跳回try块中但是这也侧面证明try中的return
                是在finally语句之后执行*/
        }

}
作者: 肖涵    时间: 2014-4-2 17:31
在try catch异常语句中,当try语句中出现异常时,执行catch语句,catch语句中的return首先返回一个结果保存在内存中,如果后面还有finally语句是,必定要执行finally语句,finally中如果有return的话,会再次返回一个值,覆盖catch中的return值。




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