Объясните дураку(в основном работаю с 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
}
}
Комментариев нет:
Отправить комментарий