【问题标题】:why cant custom Exception be caught in generic catch clause为什么不能在通用 catch 子句中捕获自定义异常
【发布时间】:2015-01-22 22:26:19
【问题描述】:

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

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 类。这看起来违背了多态性。

【问题讨论】:

  • "...NullPointerException is derived from Exception class and so is my custom ReportException so since there the same type..." -- 狗是动物,猫也是,但这并不意味着狗是猫。
  • NullPointerExceptionReportException都是Exceptions,但NullPointerException不是ReportException的一种。同理,德国人和意大利人都是欧洲人,但德国人不是意大利人。
  • @immibis 错误。 Polymorphism. 顺便说一下,这个问题实际上是关于什么的。

标签: java exception inheritance exception-handling polymorphism


【解决方案1】:

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

改为使用ReportException

【讨论】:

  • 或者捕获异常。或者有一个 catch 块让两者独立处理。
【解决方案2】:

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

这是有效的:

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

Java: checked vs unchecked exception explanation

【讨论】:

  • 不过,这实际上与选中与未选中无关。这真是一个关于多态性的问题。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多