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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程媛媛 中级黑马   /  2013-3-26 23:39  /  1408 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程媛媛 于 2013-3-27 13:56 编辑

public class Demo6{
        public int methodA(int money)throws Exception{
                if(--money<=0)throw new Exception("Out of Money");
                return money;
        }
        public int methodB(int money){
                try {
                        return methodA(money);
                } catch (Exception e) {
                        // TODO: handle exception
                        return -100;
                }finally{
                        return 100;
                }
        }
        
        public static void main(String[] args) throws Exception {
                Demo6 d = new Demo6();
                System.out.println(d.methodB(1));
                System.out.println(d.methodB(2));
        }
}
打印结果为:
100
100
为什么打印的结果都是100呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
finally{
                        return 100;
}

点评

再详细点解释就更好了,解释下finally的作用。  发表于 2013-3-27 11:37
回复 使用道具 举报
关于这个问题,其实根据分析它的每一步便可一目了然:
1、当d.methodB(1)执行时,便可进入
              try {      
                    return methodA(money);
            }
2、由于返回methodA(money);所以此时将1传递给了函数methodA中的参数money,
根据--money,所以if满足条件:
       if(--money<=0){
             throw new Exception("Out of Money");
            }
直接抛出了一个异常,而抛出的这个异常又被函数methodB中的catch捕获,按理说应该最后返回-100;为什么会这样呢?我们都知道,finally{}是无论程序如何都要被执行的代码块,所以根据最后执行结果,最后返回的只能是finally{return 100}中的100;要不如果直接返回-100的话,那么如何保证finally{}代码块必须执行呢。所以这是第一个100的结果。
3、接下来分析d.methodB(2),由以上可知,--money<=0即(1<=0)不满足条件,所以直接返回1,并将1直接又交给methodB的返回值,同理,由于finally{return 100}还是必须要执行的代码块,所以第二个100还是finally内部的返回值100

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你想问的应该是为什么当输入参数1自减的时候,应该返回的结果是-100而不是100对不?
是的,虽然当执行到--money<=0;这条语句时,此时的抛出异常,但是catch是用来捕捉异常的,也就是说返回的是-100;但是,此时的程序还将继续执行下去,因为问题已经被处理了,所以,最后finally的语句中的100将-100覆盖了并打印出来,所以结果是100。同理当传入的参数为2时,跟上面传入参数为1的结果是一样的。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问;没有的话,尽量及时将帖子分类改成【已解决】哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马