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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 路西法 中级黑马   /  2014-4-1 12:35  /  1786 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

用代码证明,在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的先自加  这时为什么呢?

点评

发帖的时候将代码放到代码块中,这样又便于别人阅读!  发表于 2014-4-1 23:42

评分

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

查看全部评分

9 个回复

倒序浏览
return 是用来结束函数用的....
可想而知 函数都结束了 还finally?????
回复 使用道具 举报
我也有这道题,我自己觉得,因为finally是函数中必须执行的语句块,所以当finally还没执行的时候,所有被执行过的变量和语句块都存于内存中。
回复 使用道具 举报
我只知道finally是一定要执行的语句块 比return先执行 除非遇到System.exit(0);
回复 使用道具 举报
return ++count;我觉得关键语句是这,看两个加号在前面还是在后面。
回复 使用道具 举报
黄晓鑫 发表于 2014-4-1 12:55
我只知道finally是一定要执行的语句块 比return先执行 除非遇到System.exit(0);

我也知道finally比try中的return先执行  但是看上面的计数器  为什么return的count 比finally中的 先先执行
回复 使用道具 举报
个人看法:
当try语句后面有finally时,finally语句一定会执行(排除虚拟机崩溃或者System.exit(0);)
java 的方法中代码一般而言是自上而下执行的,遇到return 语句肯定就不会再往下执行了。
注意:finally代码块内容是最终都会执行,它强调的是无论是否有异常产生,它和try不是一个代码块的内容,所以不能把它看成是return下面的代码。
所以在这种情况下,java代码只能先执行finally语句后再return。
回复 使用道具 举报
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语句之后执行*/
        }

}
回复 使用道具 举报
在try catch异常语句中,当try语句中出现异常时,执行catch语句,catch语句中的return首先返回一个结果保存在内存中,如果后面还有finally语句是,必定要执行finally语句,finally中如果有return的话,会再次返回一个值,覆盖catch中的return值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马