【问题标题】:super class constructor in custom exception in javajava中自定义异常中的超类构造函数
【发布时间】:2013-12-14 06:19:56
【问题描述】:

我正在学习 Java 中的功能,包括异常。我正在编写自定义异常。这是我正在做的事情:自定义异常类:

 public class ServiceException extends Exception {

    private String customMessage;

    public ServiceException(String customMessage) {
        super(customMessage);
        this.customMessage = customMessage;

    }
}

主类:

    public class Main {

    public static void main(String[] args) {
        try {
            new Main().test();
        } catch (Exception e) {
            System.out.println("the exception message is " + e.getMessage());
        }
    }

    public void test() throws ServiceException {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            throw new ServiceException(e.getMessage());
        }
    }
}

我知道的就这么多: 如果自定义异常类中没有调用超类构造函数,则自定义异常中设置的消息不会传递给Exception类。但是,如果我的自定义异常类中有一个方法 public String getMessage ,即使没有调用超级,也会打印该消息。对不起,如果这是一个幼稚的问题。但我无法理解他的概念。有没有人可以帮助澄清这个概念?

【问题讨论】:

    标签: java constructor superclass


    【解决方案1】:

    在你发现错误的 main 中,你基本上是将一个 ServiceException 对象分配给一个异常引用,即将派生类对象分配给基类引用,所以如果派生类重写了该方法,它将被调用。

    被调用的e.message()是来自ServiceException而不是Exception,你是对的,当你不调用super时没有数据被传递,数据只在ServiceException类中,调用的函数也来自ServiceException类。

    【讨论】:

    【解决方案2】:

    那是因为您正在提供它。您将e.getMessage() 作为唯一参数customMessage 传递给您的构造函数。然后将customMessage 传递给其父构造函数,该构造函数采用StringException(String)。在这样做时,您正在向它提供用于serviceExceptionInstance.getMessage() 的消息。相反,不要将customMessage 传递给它的父级(使用super();,如果没有给出对父级构造函数的调用并且存在一个无参数的父级构造函数,则这是隐含的)。那么消息将是null,因为它没有提供。

    换句话说:

    new ServiceException(e.getMessage());
    

    使用来自e 的消息创建一个新的ServiceException。您将该消息传递给ExceptionServiceException 的父级。

    super(customMessage);
    

    这样做时,您使用单个参数,Exception 的基于 String 的构造函数。将值传递给该构造函数意味着您希望在调用者调用getMessage 时使用它。为避免这样做,请调用不同的父构造函数,或者根本不调用(从技术上讲,调用 none 是不可能的,它会为您隐式执行 super();):

    public ServiceException(String customMessage)
    {
        this.customMessage = customMessage;
    }
    

    这将为您调用super();,这意味着父类没有消息要发送,并且通过自己覆盖getMessage(),然后它将返回其默认值(@987654342 @)。需要明确的是,Exception 本身是从 Throwable 扩展而来的,Throwable 确实是提供此功能的类,但这一切都源于您如何使用Exception,因为它充当Throwable 的传递。

    【讨论】:

    • 我理解提供super时的过程,但我不明白的是当我不提供super时。那么getMessage函数打印的消息是如何打印的?没有数据传递给父异常类 na ?
    • 如果不提供 super,那么它确实 not 有消息要提供。它假定 no 消息,默认值为 null.
    • 是的,但是如果自定义异常类中有getMessage方法返回字符串,e.getMessage不为null?是不是因为自定义异常中的getMessage覆盖了Exception类的getMessage?
    • 感谢 pickypg 我一直在寻找动态多态性功能,在 gaurav5430 解释之前不要尝试它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多