конструктор суперкласса в пользовательском исключении в java

Я изучаю функции в 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());
        }
    }
}

Насколько я знаю: если конструктор суперкласса не вызывается в пользовательском классе исключений, сообщение, установленное в пользовательском исключении, не передается в класс исключений. Но если у меня есть метод public String getMessage в моем пользовательском классе исключений, даже если super не вызывается, это сообщение печатается. Извините, если это наивный вопрос. Но я не могу понять его концепцию. Не мог бы кто-нибудь помочь прояснить концепцию?


person Parameswar    schedule 14.12.2013    source источник


Ответы (2)


В основном, где вы ловите ошибку, вы в основном назначаете объект ServiceException ссылке Exception, т.е. назначаете объект производного класса ссылке базового класса, поэтому, если производный класс переопределил метод, он будет вызван.

e.message() вызывается из ServiceException, а не из Exception, вы правы, данные не передаются, когда вы не вызываете super, данные находятся только внутри класса ServiceException, а вызываемая функция также из класса ServiceException.

person gaurav5430    schedule 14.12.2013
comment
проверить динамический полиморфизм. простая ссылка для старта: way2java.com/oops-concepts/dynamic-polymorphism - person gaurav5430; 14.12.2013

Это потому, что вы поставляете его. Вы передаете e.getMessage() своему конструктору в качестве единственного аргумента customMessage. Затем вы передаете customMessage конструктору его родителя, который принимает String, Exception(String). При этом вы даете ему сообщение для использования для serviceExceptionInstance.getMessage(). Вместо этого не передавайте customMessage его родителю (используйте super();, что подразумевается, если не задан вызов родительского конструктора и существует родительский конструктор без аргументов). Тогда сообщение будет null, так как оно не предоставлено.

Другими словами:

new ServiceException(e.getMessage());

Создает новый ServiceException с сообщением от e. Вы передаете это сообщение Exception, родителю ServiceException.

super(customMessage);

При этом вы используете единственный аргумент, основанный на String конструктор Exception. Передача значения этому конструктору подразумевает, что вы хотите, чтобы оно использовалось, когда вызывающая сторона вызывает getMessage. Чтобы избежать этого, вызовите другой родительский конструктор или вообще не вызывайте его (вызов none технически невозможен, и он неявно сделает super(); за вас):

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

Это вызовет для вас super();, что означает, что у родительского класса нет сообщения для отправки, и если вы не переопределяете getMessage() самостоятельно, то он вернет значение по умолчанию (null). Чтобы было ясно, Exception сам расширяется от Throwable, который на самом деле является классом, обеспечивающим эту функциональность, но все это проистекает из того, как вы работаете с Exception, поскольку он служит промежуточным звеном к Throwable.

person pickypg    schedule 14.12.2013
comment
Я понимаю процесс, когда я поставляю super, но я не понимаю, когда я не поставляю super. Тогда как сообщение печатается из функции getMessage? Нет данных, переданных в родительский класс Exception na? - person Parameswar; 14.12.2013
comment
Если не указать super, то у него нет сообщения для предоставления. Предполагается, что сообщения нет, и по умолчанию используется значение null.. - person pickypg; 14.12.2013
comment
да, но если есть метод getMessage, который возвращает строку в пользовательском классе исключений, e.getMessage не равен нулю? это потому, что getMessage в пользовательском исключении переопределяет getMessage из класса Exception? - person Parameswar; 14.12.2013
comment
спасибо за то, что pickypg уделил время, я искал функцию динамического полиморфизма, не трогайте ее, пока не объяснит gaurav5430. - person Parameswar; 14.12.2013