#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.
Комментариев нет:
Отправить комментарий