为什么不能在通用 catch 子句中捕获自定义异常

why cant custom Exception be caught in generic catch clause

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

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;
    }
}

我的问题是为什么这在另一个 class:

中是非法的
try{
       throw new NullPointerException();
   }
catch(ReportException e){

}

对我来说,NullPointerException 是从 Exception class 派生的,我的自定义 ReportException 也是如此,因为有相同的类型,我希望它可以在 catch 子句中捕获。但是我的 IDE 说这是非法的。我和我的一位同事进行了讨论,他说那是不可能的,但我只是想知道为什么,因为它们都来自同一个异常 class。这看起来违背了多态性。

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

这是有效的:

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

Java: checked vs unchecked exception explanation

A NullPointerException 和你的 ReportException 都是 Exception,但是要捕获 ReportException,你必须抛出 ReportException(或子类). NullPointerException 不是 ReportException 的子类,因此未被捕获。

改为 ReportException

java 中的每个 class 都是 java.lang.Object 的继承者,但这并不意味着所有这些 class 都可以转换为每个 class -其他.

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