Если у меня есть метод, который выдает исключение, например:
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
полезно. Мне было бы интересно узнать мнение других об этом.