Метод реализации Выдает исключение, но метод интерфейса не определяет, поскольку он вызывает исключение

При реализации интерфейса вполне допустимо, чтобы методы интерфейса не генерировали исключение, но метод класса реализации может генерировать исключение.

Определение интерфейса

public interface exceptionNotDefined {
    void doNotThrowException();
}

Реализующий класс

public class exceptionNotDefinedImpl implements exceptionNotDefined {
    @Override
    public void doNotThrowException() throws RuntimeException{

    }
}

какая логика стоит за этим, и какая часть спецификации языка Java занимается этим.

1 ответ

Решение

... какая логика стоит за этим

Логика лучше всего описывается словом "заменяемость".

Когда метод интерфейса объявляется как "выбрасывающий" проверенное исключение, он говорит, что вызывающая сторона должна иметь дело с этим исключением (перехватывая его или объявляя его... или супертип).

Когда вы затем реализуете метод, не выбрасывая исключение, вызов метода является заменяемым. Вызывающая сторона, у которой есть код для обработки возможности исключения, может справиться, если исключение не будет выброшено.

Другая проблема заключается в том, что в реализующем классе вы объявили метод как RuntimeException, RuntimeException и его подклассы являются непроверенными исключениями, а язык Java говорит, что вызывающему не нужно иметь дело с непроверенными исключениями. Так что, на самом деле, throws RuntimeException не имеет практического эффекта, кроме документирования намерений дизайнера API.


... какая часть спецификации языка Java имеет дело с этим.

Раздел 11.2 JLS охватывает большую часть этого на высоком уровне, а также конкретные правила переопределения методов (включая throws пункты) приведены в JLS 8.4.8.3.

Другие вопросы по тегам