Предложение throws
является частью контракта метода. Он требует, чтобы вызывающий метод вел себя так, как будто указанное исключение может быть вызвано методом (т. е. либо перехватывало исключение, либо объявляло собственное предложение throws
).
Возможно, что первоначальная версия метода не выдает исключение, указанное в предложении throws
, но будущая версия может выдать его без нарушения API (т. е. любой существующий код, вызывающий метод, все равно пройдет компиляцию).
Возможно и обратное. Если метод, используемый для создания исключения, указанного в предложении throws
, но его будущая версия больше не генерирует его, вы должны сохранить предложение throws
, чтобы не нарушать существующий код, использующий ваш метод.
Первый пример:
Предположим, у вас есть этот код, который использует methodB
:
private static void methodA() {
methodB(); // doesn't have throws IOException clause yet
}
Если позже вы захотите заменить methodB
на throw IOException
, methodA
перестанет проходить компиляцию.
Второй пример:
Предположим, у вас есть этот код, который использует methodB
:
private static void methodA() {
try {
methodB(); // throws IOException
}
catch (IOException ex) {
}
}
Если вы удалите предложение throws
из будущей версии methodB
, methodA
больше не будет проходить компиляцию.
Этот пример не очень интересен, когда methodA
равно private
, потому что его можно использовать только локально (внутри того же класса, где легко модифицировать все вызывающие его методы).
Однако, если он становится public
, вы не знаете, кто использует (или будет использовать) ваш метод, поэтому вы не контролируете весь код, который может сломаться в результате добавления или удаления предложения throws
.
И если это метод экземпляра, есть еще одна причина разрешить предложение throws
, даже если вы не выдаете исключение — метод может быть переопределен, а переопределяющий метод может выдать исключение, даже если реализация базового класса этого не делает.
person
Eran
schedule
25.03.2019
throws
вводит в заблуждение. Сейчас я разбираю это какcould_throw
, и мне кажется, что это лучше соответствует его поведению. - person Eric Duminil   schedule 25.03.2019