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