Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Java: наследование контркуктора

#java #наследование


Объясните дураку(в основном работаю с php), почему при наследовании исключений, не
наследуются все конструкторы.

Кейс №1
Есть класс расширяющий исключения(без конструктора)

package test.exceptions;
public class StatusException extends Exception {
    final public static String STATUS_NOT_EXIST = "Status: not exist";
}


Есть код выкидывающий исключение:

public static void test() throws StatusException {
    String message= StatusException.STATUS_NOT_EXIST;
    throw new StatusException(message);
}


При компиляции получаю ошибку о несоответствие сигнатур конструкторов

Error:(26, 15) java: constructor StatusException in class test.exceptions.StatusException
cannot be applied to given types;
  required: no arguments
  found: java.lang.String
  reason: actual and formal argument lists differ in length


Кейс №2
Исключение с конструктором принимающим String

package test.exceptions;
public class StatusException extends Exception {
    final public static String STATUS_NOT_EXIST = "Status: not exist";

    public StatusException(String message) {
        super(message);
    }
}


Код выкидывающий исключение:

public static void test() throws StatusException {
    String message= StatusException.STATUS_NOT_EXIST;
    throw new StatusException();
}


Ошибка

Error:(24, 15) java: constructor StatusException in class test.exceptions.StatusException
cannot be applied to given types;
  required: java.lang.String
  found: no arguments
  reason: actual and formal argument lists differ in length

    


Ответы

Ответ 1



Конструкторы не наследуются. Касательно первого примера - вы должны явно создать конструктор с параметром: public class StatusException extends Exception { final public static String STATUS_NOT_EXIST = "Status: not exist"; public StatusException(String message) { super(message); } } Касательно второго примера. Если явно не задан ни один конструктор, то по умолчанию создается пустой конструктор без параметров. То есть в первом примере у вас будет неявно создан такой конструктор. Если же явно определен хотя бы один конструктор, то конструктор без параметров следует так же явно указать. Следовательно, для второго примера нужно так: public class StatusException extends Exception { final public static String STATUS_NOT_EXIST = "Status: not exist"; public StatusException(String message) { super(message); } public StatusException() { //nothing or call super } }

Комментариев нет:

Отправить комментарий