java中自定义异常中的超类构造函数

时间:2013-12-14 06:19:57

标签: java constructor superclass

我正在学习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 ,即使没有调用super,也会打印该消息。对不起,如果这是一个天真的问题。但我没有理解他的概念。可以来帮助清除这个概念吗?

2 个答案:

答案 0 :(得分:0)

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

换句话说:

new ServiceException(e.getMessage());

使用ServiceException的消息创建新的e。您将该邮件传递给ExceptionServiceException的父级。

super(customMessage);

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

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

这将为您调用super();,这意味着父类没有要发送的消息,而自己覆盖getMessage(),它将返回其默认值值(null)。需要说明的是,Exception本身来自Throwable,它实际上是提供此功能的类,但这一切都源于您使用Exception的方式,因为它作为传递来实现Throwable

答案 1 :(得分:0)

在捕获错误的主要部分中,您基本上将ServiceException对象分配给Exception引用,即将派生类对象分配给基类引用,因此如果派生类已重写该方法,则会调用它。 / p>

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