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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨剑 中级黑马   /  2013-2-25 16:15  /  2600 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨剑 于 2013-3-18 12:57 编辑

public class Test{
        public static void main(String[] args) {
                System.out.println(aaa());
        }
        public static int aaa(){
                try {
                        return 1;
                }finally{
                        return 2;
                }
        }
}
打印结果是2,为什么不是1呢,是不是2把1给覆盖了呢,不知道是如何执行的。

9 个回复

倒序浏览
这问题跟你那个1  是一个问题。。。。。已经回答
回复 使用道具 举报
aaa这个函数在读到第一个return之前,还去读一读finally的内容,finally里面直接有return,所以第一个return就郁郁而终了
回复 使用道具 举报
首先,除非在try块、catch块中调用了退出虚拟机的方法(System.exit(参数)),否则在执行怎样的代码,出现怎样的情况,异常处理的finally块总会被执行。

其次,在通常情况下,不要在finally块中使用如return或throw等导致方法终止的语句,否则会导致try块、catch块中的return、throw语句失效。

回复 使用道具 举报
原因就是在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行的。无论try语句块是正常结束的,还是意外结束的,情况都是如此。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句。

当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally语句意外结束的原因将于finally语句块意外结束的原因相同。在这个程序中,在try语句块中的return语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。简单地讲,程序尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。

丢弃意外结束的原因几乎永远都不是你想要的行为,因为意外结束的最初原因可能对程序的行为来说会显得更重要。对于那些在try语句块中执行break、continue或return语句,只是为了使其行为被finally语句块所否决掉的程序,要理解其行为是特别困难的。

总之,每一个finally语句块都应该正常结束,除非抛出的是不受检查的异常。千万不要用一个return、break、continue或throw来退出一个finally语句块,并且千万不要允许将一个受检查的异常传播到一个finally语句块之外去。
回复 使用道具 举报
我认为
一、finally肯定要执行
二、try中的return 后于finally执行 (可以认为执行了一半,因为finally的语句没有影响return变量的值)
三、finally中有return语句则必以此语句结束(那么try中的return语句就半途而废了)
这样可以看出 java中 finally语句会在程序结束的最后关头才运行(上例中它就在储存好数值准备返回的时候,执行finally语句)

一般的finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。
回复 使用道具 举报
这个问题被问过很多次了。你应该去看finally块的执行规则就很容易明白了。在try块里出现return时,JVM是会立即去执行finally块的内容。
因为finally块有return语句,try块里的return不再有 执行机会。
回复 使用道具 举报
try{}finally{}结构中,finally中的语句一定被执行有且只有一次。至于你问的问题为什么是2,而不是1,因为程序是先执行try{}中的内容,在 try {}中return 之前执行finally中的内容,可以加打印语句试验下
回复 使用道具 举报
王昕 中级黑马 2013-2-26 14:10:08
9#
感觉楼上有些回答有点问题,如果在try块中写return i++;这种i++其实是在finally块之前执行了的,只不过没有return。
int i = 0;
try{
    return i++;
}finally{
    System.out.println(i);    //输出是1
    ……
}
回复 使用道具 举报
public class Test{
        public static void main(String[] args) {
                System.out.println(aaa());
        }
        public static int aaa(){
                try {
                        return 1;//执行到这里,在return前finally会执行
                }finally{
                        return 2;//执行到这里return会把2返回会,如果finally没有return打印的就是1;
                }
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马