为什么不能将自定义异常捕获到泛型catch子句中

时间:2015-01-22 22:26:19

标签: java exception inheritance exception-handling polymorphism

请检查下面的自定义例外:

public class ReportException extends Exception {



    private int mCode = -1;
    private String mString = "";


    public ReportException(int code, String description)
    {
        super(description);
        mCode = code;
        mString = description;
    }


    public int getCode()
    {
        return mCode;
    }


    public String getString()
    {
        return mString;
    }
}

我的问题是为什么在另一堂课中这是非法的:

try{
       throw new NullPointerException();
   }
catch(ReportException e){

}

对我来说,NullPointerException是从Exception类派生的,因此我的自定义ReportException也是如此,因为我希望它可以在catch子句中捕获。但我的IDE说这是非法的。我与我的一位同事进行了这次讨论,他说那里无法完成,但我只是想知道为什么因为它们都来自同一个Exception类。这看起来无视多态性。

3 个答案:

答案 0 :(得分:5)

NullPointerException而您的ReportException都是Exception,但要抓住ReportException,您必须抛出ReportException(或子类)。 NullPointerException不是ReportException的子类,因此未被捕获。

改为ReportException

答案 1 :(得分:0)

try块中的某些代码必须抛出已检查的异常才能显式捕获它。

这是有效的:

try {
    throw new ReportException();
}
catch(ReportException e){
    // handle it
}

请参阅Java: checked vs unchecked exception explanation

答案 2 :(得分:0)

java中的每个类都是java.lang.Object的后继者,但这并不意味着所有这些类都可以互相转换。

对于计算机而言,这两个类彼此完全不同。