Próbuję zdefiniować własną klasę wyjątków w najprostszy sposób, a oto, co otrzymuję:
public class MyException extends Exception {}
public class Foo {
public bar() throws MyException {
throw new MyException("try again please");
}
}
Tak mówi kompilator Java:
cannot find symbol: constructor MyException(java.lang.String)
Miałem wrażenie, że ten konstruktor musi zostać odziedziczony java.lang.Exception
, prawda?
java
exception
inheritance
yegor256
źródło
źródło
if your class has no constructor, you get the default even if the superclass does not have it
Ostatnia część jest niemożliwa, chyba że nadklasa ma domyślnego konstruktora, który jest dostępny dla tej klasy (może być chroniony lub chroniony przez pakiet). W przeciwnym razie musisz jawnie wywołać jednego z konstruktorów nadrzędnych, w przeciwnym razie kompilacja się nie powiedzie.MyException(Throwable)
i,MyException(String, Throwable)
aby poprawnie obsługiwać łańcuchy wyjątków .Typowy niestandardowy wyjątek, który zdefiniuję, jest mniej więcej taki:
Nawet tworzę szablon za pomocą Eclipse, więc nie muszę pisać wszystkich rzeczy od nowa.
źródło
Jeśli użyjesz nowego okna dialogowego klasy w Eclipse, możesz po prostu ustawić pole Superclass na
java.lang.Exception
i zaznaczyć „Constructors from superclass”, a wygeneruje to:W odpowiedzi na poniższe pytanie dotyczące nie wywoływania
super()
defektywnego konstruktora Oracle ma do powiedzenia :źródło
super()
?Powód tego wyjaśniono w artykule o dziedziczeniu platformy Java, który mówi:
źródło
źródło
Klasa wyjątków ma dwa konstruktory
public Exception()
- Konstruuje wyjątek bez żadnych dodatkowych informacji. Charakter wyjątku zwykle wywodzi się z nazwy klasy.public Exception(String s)
- Tworzy wyjątek z określonym komunikatem o błędzie. Szczegółowy komunikat to ciąg znaków opisujący warunek błędu dla tego konkretnego wyjątku.źródło
public Exception(Throwable)
ipublic Exception(String, Throwable)
. Są one potrzebne do prawidłowego obsługi łańcuchów wyjątków .Jeśli dziedziczysz po wyjątku, musisz podać konstruktor, który przyjmuje parametr jako parametr (będzie zawierał komunikat o błędzie).
źródło
i nie zapomnij o najprostszym sposobie zgłoszenia wyjątku (nie musisz tworzyć klasy)
źródło