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