黑马程序员技术交流社区

标题: finally问题,不明白啊 [打印本页]

作者: dddlinux    时间: 2015-8-13 00:10
标题: finally问题,不明白啊
本帖最后由 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;
        }
}



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

嗯,现在明白点了,之前没想到,局部变量还能这么玩
作者: dddlinux    时间: 2015-8-13 23:31
黑进制 发表于 2015-8-13 09:28
catch中的60 要等finall执行后才能返回a  最后一句是返回了catch中的a

明白了
作者: 秋天中の夏季    时间: 2015-8-14 19:35
可是finally并没有返回a,在他前面就已经返回了a了啊




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