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

Java 为什么不能在泛型catch子句中捕获自定义异常,java,exception,inheritance,exception-handling,polymorphism,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;

请在下面检查我的自定义异常:

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说这是非法的。我和我的一位同事讨论过这个问题,他说这是不可能的,但我只是想知道为什么,因为它们都来自同一个异常类。这看起来是对多态性的挑战

try
块中的某些代码必须抛出选中的异常,然后才能显式捕获它

这是有效的:

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

请参见在
try
块中的某些代码必须抛出选中的异常,然后才能显式捕获它

这是有效的:

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

请参见A
nullpointereexception
和您的
ReportException
都是
Exception
s,但要捕获
ReportException
,必须抛出
ReportException
(或子类)。
NullPointerException
不是
ReportException
的子类,因此它不会被捕获


抛出一个
ReportException

a
NullPointerException
和您的
ReportException
都是
Exception
,但要捕获
ReportException
,必须抛出一个
ReportException
(或子类)。
NullPointerException
不是
ReportException
的子类,因此它不会被捕获


抛出一个
ReportException

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


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

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


对于计算机来说,这两个类是完全不同的。

“…NullPointerException是从Exception类派生的,我的自定义ReportException也是如此,因为有相同的类型…”
--狗是动物,猫也是,但这并不意味着狗就是猫。
NullPointerException
ReportException
都是
Exception
s,但是
NullPointerException
不是一种
ReportException
。同样,德国人和意大利人都是欧洲人,但德国人不是意大利人。@immibis False。顺便说一句,这就是这个问题的实质。
“…NullPointerException是从Exception类派生的,我的自定义ReportException也是如此,因为有相同的类型…”
--狗是动物,猫也是,但这并不意味着狗就是猫。
NullPointerException
ReportException
都是
Exception
s,但是
NullPointerException
不是一种
ReportException
。同样,德国人和意大利人都是欧洲人,但德国人不是意大利人。@immibis False。顺便说一句,这就是这个问题的实质。或者说,捕捉异常。或者两者都有一个catch块来分别处理。或者catch异常。或者两个都有一个catch块来独立处理,但这与checked和unchecked没有关系。这确实是一个关于多态性的问题。不过,这与检查与未检查并没有关系。这确实是一个关于多态性的问题。