Страницы

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

среда, 10 апреля 2019 г.

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


Ответ

Конструкторы не наследуются. Касательно первого примера - вы должны явно создать конструктор с параметром:
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 } }

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

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