Если у меня есть метод, который выдает непроверенное исключение, например:
void doSomething(int i) {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
есть ли преимущество в явном объявлении того, что метод выдает исключение, т.е.
void doSomething(int i) throws IllegalArgumentException {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
в отличие от (или в дополнение к) описания поведения в javadoc:
/**
* This method does something useful.
* @param i some input value
* @throws IllegalArgumentException if {@code i < 0}
*/
void doSomething(int i) {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
Причины, по которым я бы сказал, что бесполезно иметь throws
, следующие:
throws
не предоставляет информации об обстоятельствах, при которых будет сгенерировано исключение, а только то, что оно может быть сгенерировано;- Поскольку это непроверенное исключение, я не обязан обрабатывать исключение в вызывающем коде. Я действительно узнаю, что это может быть брошено, только если я пойду и посмотрю на реализацию
doSomething
; - Тело
doSomething
может вызывать код, который генерирует другие типы непроверенных исключений; утверждение, что «этот метод выдаетIllegalArgumentException
», кажется, что потенциально это только часть истории; - Если метод не является окончательным, его можно переопределить таким образом, что новая реализация будет объявлена выбрасывающей дополнительные непроверенные исключения; вы не знаете, какую реализацию вы вызываете.
Причины, по которым я утверждаю, что было бы полезно иметь throws
:
- Он сообщает о проблеме, с которой можно было бы разумно столкнуться при вызове метода.
Короче, я думаю, что throws
не нужен, а описание javadoc через @throws
полезно. Мне было бы интересно узнать мнение других по этому поводу.