Всем добрый вечер.
Столкнулся с интересной особенностью переопределяемых методов — исключения в них нельзя пробросить, только обработка внутри метода. Но почему? Хочется получить исчерпывающий ответ на этот вопрос.
Ответ
Есть два вида исключений в Java — checked и unchecked, подробнее можно почитать, например, в этой статье
Checked исключения проверяются на этапе компиляции приложения, и должны где-то отлавливаться (catch), а методы, которые выбрасывают такие исключения, должны иметь в сигнатуре тип исключения, который может быть выброшен (напр. void method() throws Exception). При переопределении (@Override) метода, в сигнатуре которого не указан throws, нельзя бросить checked-исключение, потому что компилятор не сможет его отследить. Нерабочий пример:
class A {
void foo() {}
}
class B extends A {
@Override
void foo() throws Exception {}
}
A obj = new B();
obj.foo(); // Компилятор рассматривает obj как A, в котором нет throws, и не знает о том, что он бросает checked-исключение
Вы можете бросить unchecked-исключение, на основе RuntimeException или Error, без добавления throws в сигнатуру перезагруженного метода. Конечно, если вам не нужно именно checked-исключение.
Комментариев нет:
Отправить комментарий