#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 } }
Комментариев нет:
Отправить комментарий