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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java陈辉 中级黑马   /  2014-1-15 22:07  /  1047 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面这段代码执行的结果为什么是"bb"、"dd"、"cc",而不是"bb"、"cc"、"dd"呢?求解释。
public class Demo7_Exception {
        public static void main(String[] args) {
                Test t=new Test();
                System.out.println(t.print());
    }
}
class Test {
        public String print() {
                try {
                        System.out.println(1/0);
                        return "aa";
                } catch (RuntimeException e) {
                        System.out.println("bb");                       
                        return "cc";
                }finally {                                               
                        System.out.println("dd");

                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

9 个回复

倒序浏览
finallyz中的数据会在return之前执行,finally只有在System.exit(0)后不执行

评分

参与人数 1黑马币 +3 收起 理由
黄晓鑫 + 3 山寨

查看全部评分

回复 使用道具 举报
想明白整个程序的执行流程也就能明白了啊
首先你调用了print方法
在try中 1/0 会有异常  所以执行catch方法
catch方法中会先打印一个bb  然后return cc
要知道 return会终止一个方法的执行,就是说按常理来说,方法中return  cc  之后的代码都不会执行
但是你后面用了finally  这个又是一个特殊的关键字  finally里面的代码是一定会执行的,所以在print方法执行完毕之前会执行finally里面的打印dd 也就是在return cc之前打印dd
之后main函数中接受到print的返回值cc才会打印出cc
所以结果是bb  dd  cc
希望对你有帮助
回复 使用道具 举报
1. 1/0 放生异常,进去catch代码块,打印bb
2. 程序发现return语句,先去执行finally,打印dd
3. 返回cc 打印
回复 使用道具 举报
因为0在java中不能作为除数到那里就抛异常了 然后走了相应的catch语句运行时异常(runtimeException)所以程序跳转输出了cc然后finally是一定要执行的语句先执行了一下dd然后程序再跳回来执行了cc aa是执行不到了因为除0已经发生异常也对异常进行了处理
回复 使用道具 举报
catch (RuntimeException e) {
                        System.out.println("bb");                        
                        return "cc";
}
如catch代码所示,在因为在捕获到异常后,先执行了语句System.out.println("bb");输出"bb"
在输出bb后方法没有结束必须去执行finally,所以输出了"dd". 而"cc"的输出是因为方法在执行完成后,
将"cc"返回给主函数,通过语句 System.out.println(t.print());输出.
System.out.println(t.print());
回复 使用道具 举报
我是这样理解 return  最后肯定是返回调用它的方法,但它之前,一定会有finally语句先执行。这样才算执行完代码 返回调用方法。所以finally算执行的代码,执行完后再返回方法。如果return改为 exit 则会不管finally 直接退出虚拟机
回复 使用道具 举报
return "cc"只是把"cc"传递给了调用者,还没有开始打印,程序还没有结束,一定会执行的fianlly中先打印了"dd"之后print函数才结束此时回到主函数中打印刚才传过来的值,所以结构就是"bb" "dd" "cc"
回复 使用道具 举报
依然 中级黑马 2014-1-15 22:42:01
9#
黄晓鑫 发表于 2014-1-15 22:23
因为0在java中不能作为除数到那里就抛异常了 然后走了相应的catch语句运行时异常(runtimeException)所以 ...

哥们,为什么给我点评是山寨啊?他问题的重点是顺序的问题,我回答的虽然不是很完整,但不应该算是山寨吧。山寨应该是剽窃、赋值的代名词吧,还望给个说法,谢谢
回复 使用道具 举报
谢谢 随便点点 这个没有关系的 呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马