Страницы

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

среда, 3 октября 2018 г.

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

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


Ответ

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

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

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