为了账号安全,请及时绑定邮箱和手机立即绑定

作业中,initCause(e)的作用是什么啊?

bookNotExists.initCause(e);请问这句代码起什么作用啊?



正在回答

5 回答

字数太多,发到这里。

不是为了实现哪一句代码的。initCause()这个方法就是对异常来进行包装的,目的就是为了出了问题的时候能够追根究底。因为一个项目,越往底层,可能抛出的异常类型会用很多,如果你在上层想要处理这些异常,你就需要挨个的写很多catch语句块来捕捉异常,这样是很麻烦的。如果我们对底层抛出的异常捕获后,抛出一个新的统一的异常,会避免这个问题。但是直接抛出一个新的异常,会让最原始的异常信息丢失,这样不利于排查问题。举个例子,在底层会出现一个A异常,然后在中间代码层捕获A异常,对上层抛出一个B异常。如果在中间代码层不对A进行包装,在上层代码捕捉到B异常后就不知道为什么会导致B异常的发生,但是包装以后我们就可以用getCause()方法获得原始的A异常。这对追查BUG是很有利的。

class A{
    try{
        ...
    }catch(AException a){
     throw new BException();
    }
}
...
class B{
    try{
        ...
    }catch(BException b){
        //这时候你需要去看b异常式什么问题导致的,你在A类里面
        //没有对AException进行包装,所以你无法知道是A导致的B
    }
}

如果包装以后:

class A{
    try{
        ...
    }catch(AException a){
        BException b = new BEexception();
        b.initCause(a);
        throw b;
    }
}
...
class B{
    try{
        ...
    }catch(BException b){
        //什么导致了b呢?
        b.getCause();//得到导致B异常的原始异常
    }
}

这样看应该很明白了吧。

37 回复 有任何疑惑可以回复我~
#1

天涯蝶舞 提问者

非常形象,谢谢!
2015-12-21 回复 有任何疑惑可以回复我~
#2

不甘于现实

哈哈 看懂了 有意思
2016-05-17 回复 有任何疑惑可以回复我~
#3

player007

为什么我用eclipse使用直接throw异常和e.printStackTrace这个两个方法都能在控制台上打印出异常但是使用getCause却什么都没有
2016-08-05 回复 有任何疑惑可以回复我~
#4

没名堂的我

赞赞赞
2017-02-28 回复 有任何疑惑可以回复我~
查看1条回复

b.getCause();得到的原始异常是指包装前的异常吗?

0 回复 有任何疑惑可以回复我~

多少明白了一些!

0 回复 有任何疑惑可以回复我~

牛叉,有解释有代码好赞

0 回复 有任何疑惑可以回复我~

我之前回答过这个问题,你可以去看看

newExc.initCause(e); 这句话是什么意思 可有可无么

0 回复 有任何疑惑可以回复我~
#1

天涯蝶舞 提问者

感觉还是有些模糊,加上这一句是为了实现哪一句代码呢?
2015-12-20 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

作业中,initCause(e)的作用是什么啊?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信