黑马程序员技术交流社区

标题: 关于异常的问题 [打印本页]

作者: 程媛媛    时间: 2013-3-26 23:39
标题: 关于异常的问题
本帖最后由 程媛媛 于 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呢?
作者: 李红志    时间: 2013-3-27 00:02
finally{
                        return 100;
}
作者: _王涛    时间: 2013-3-27 00:18
关于这个问题,其实根据分析它的每一步便可一目了然:
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

作者: 曾祥旭    时间: 2013-3-27 00:48
你想问的应该是为什么当输入参数1自减的时候,应该返回的结果是-100而不是100对不?
是的,虽然当执行到--money<=0;这条语句时,此时的抛出异常,但是catch是用来捕捉异常的,也就是说返回的是-100;但是,此时的程序还将继续执行下去,因为问题已经被处理了,所以,最后finally的语句中的100将-100覆盖了并打印出来,所以结果是100。同理当传入的参数为2时,跟上面传入参数为1的结果是一样的。
作者: 陈丽莉    时间: 2013-3-27 11:37
若还有问题,请继续追问;没有的话,尽量及时将帖子分类改成【已解决】哦~




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