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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dddlinux 中级黑马   /  2015-8-13 00:10  /  901 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dddlinux 于 2015-8-13 00:15 编辑

这段代码返回的结果是60,不是finally在return之前执行的吗
为什么结果还这样?
public class Test {
        public static void main(String[] args) {
                System.out.println(getInt());
        }
        public static int getInt() {
                int a = 23;
                try {
                        System.out.println(a / 0);
                        a = 45;
                } catch (Exception e) {
                        a = 60;
                        return a;         
                } finally {
                        a = 70;
                }
                return a;
        }
}


8 个回复

倒序浏览
如果你把最后一个return a放在finally块内,则是return finally的a。也就是说,try或catch这两个,和finally中都有return的时候,执行finally的。但是,你的最后的return是在整个try-catch块外边的,所以,要看上一个返回的值来决定。那么执行的顺序仍然是catch后没有直接return,而是执行了finally,然后再回到catch,执行return。请注意,代码块中的变量是局部变量,所以回去之后70的值就没有跟来了,所以还是60。我觉得还是理解局部变量的作用域问题。
回复 使用道具 举报 1 0
刚在试了一下,你说的是对的,发现这跟之前学习一个知识点有点类似,2个基本类型的数,通过一个函数交换后,结果还是没有有交换,引用的数据类型就不同了,谢了!!
回复 使用道具 举报
catch中的60 要等finall执行后才能返回a  最后一句是返回了catch中的a
回复 使用道具 举报
你说的是在最后一个retuen a前面执行因为你try出错了所以执行catch catch里面直接a=60然后return了    你把最后一个return a放到finally{}里面结果就是70
回复 使用道具 举报
是的,一楼正解,先执行try,捕获异常,跳到catch中,执行a=60,然后执行finally中的语句(注意:代码块中的变量是基本数据类型,所以回去之后70的值就没有跟来了,所以还是60),然后执行catch中的return

评分

参与人数 1黑马币 +2 收起 理由
柳柳桑 + 2

查看全部评分

回复 使用道具 举报
孟茹 发表于 2015-8-13 19:18
是的,一楼正解,先执行try,捕获异常,跳到catch中,执行a=60,然后执行finally中的语句(注意:代码块中的 ...

嗯,现在明白点了,之前没想到,局部变量还能这么玩
回复 使用道具 举报
黑进制 发表于 2015-8-13 09:28
catch中的60 要等finall执行后才能返回a  最后一句是返回了catch中的a

明白了
回复 使用道具 举报
可是finally并没有返回a,在他前面就已经返回了a了啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马