问答详情
源自:1-7 Java 中的异常链

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

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

提问者:weibo_我不学习没人爱_0 2015-12-01 10:28

个回答

  • sxian_wang
    2015-12-01 19:24:47
    已采纳

    这是对异常的一种包装技巧。更底层产生的异常需要上层的代码来进行处理。一般而言,如果上层的代码catch到一个异常以后,你想对更上层的结构抛出一个更高级异常来说明。你可以直接在catch语句块中throw一个新的异常,但是这样的做法是不被提倡的,因为你这样会丢失底层产生的异常的信息。现在假如在你的某段代码会产生FileNotFoundException,你需要通过一个中间的代码向上面抛出一个IOException你有这么两种做法:

    try{
        代码...
    }catch(FileNotFoundException e){
        throw new IOException;
    }

    这是第一种,但是这种做法是不被提倡的,因为他会丢掉原始异常。正确的做法是这样的:

    try{
        代码...
    }catch(FileNotFoundException e){
        Throable se = new IOException("error...");
        se.initCause(e); 
        throw se;
    }

    initCause()的作用你可以理解成是保存原始的异常,当你想要知道底层发生了什么异常的时候调用getCause()就能够获得原始异常。其实这就形成一个异常链了,这对于你的代码是很有帮助的。

  • 追及相遇
    2017-12-15 10:10:08

    第一种代码也可以写成这样,是不是就考虑一下“不提倡”了呢?代码如下:

    try{

        代码...

    }catch(FileNotFoundException e){

        throw(IOException) 

        new IOException("error...").initCause(e);

    }


  • ICE_Banksy
    2017-06-19 15:16:50

    Throable是不是写错了


  • weibo_老孟就是我_0
    2016-12-16 09:14:22

    很好很形象

  • 大脑艾瑞克
    2016-01-10 17:14:31

    您好,我其实想知道,异常链是干嘛用的?这个异常链很经常用到么?