Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Почему в переопределяемом (@Override) методе нельзя пробросить Exception?

#java #исключения #override


Всем добрый вечер.

Столкнулся с интересной особенностью переопределяемых методов — исключения в них
нельзя пробросить, только обработка внутри метода. Но почему? Хочется получить исчерпывающий
ответ на этот вопрос.
    


Ответы

Ответ 1



Есть два вида исключений в 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-исключение.

Ответ 2



Можно, если переопределяемый метод суперкласса объявлен, как выбрасывающий тот же тип исключений или базовый к нему. Это один из основных принципов ООП - LSP.

Комментариев нет:

Отправить комментарий