如果我有一个引发未经检查的异常的方法,例如:
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
很有用。我很想知道其他人对此的看法。