例如,许多框架/JDK中的方法可能会抛出
java.lang.SecurityException
但是在方法签名中没有指明这一点(因为这通常是为已检查的异常保留的做法)。 我想争论声明RuntimeExceptions在方法签名中有许多好处(类似于静态类型检查)。 我是醉了还是其他的原因?
在签名中声明未经检查的异常是误导 API 用户的行为,因此我不会这样做。现在不再明显该异常是否必须显式处理。
在 javadoc 中声明它是一种更好的方法,因为它允许某些人在认为必要时处理它,但也知道他们可以忽略它,从而清晰地区分已检查和未检查的异常。
"如果记录一个方法的API(应用程序编程接口)包括它可能抛出的异常是如此重要,为什么不指定运行时异常呢?" 运行时异常代表的是由于编程问题而产生的问题,因此,API客户端代码不能合理地预期从中恢复或以任何方式处理它们。这些问题包括算术异常,例如除以零;指针异常,例如尝试通过null引用访问对象;和索引异常,例如尝试通过太大或太小的索引访问数组元素。
运行时异常可以在程序的任何位置发生,并且在典型的程序中可能非常多。 在每个方法声明中添加运行时异常将降低程序的清晰度。
请查看Collection#add的javadoc文档。
文档中提到了一系列未经检查的异常:
Throws:
UnsupportedOperationException - add is not supported by this collection.
ClassCastException - class of the specified element prevents it from being added to this collection.
NullPointerException - if the specified element is null and this collection does not support null elements.
IllegalArgumentException - some aspect of this element prevents it from being added to this collection.
如果你有耐心,我建议你这样彻底记录方法可能抛出的异常。在某种程度上,对于未经检查的异常更加重要,因为已检查的异常有些是自注释的(编译器强制调用代码承认它们)。
throws
关键字。这不是同一件事情。是的,你绝对应该记录API抛出的所有异常,但问题不是关于那个的。 - Gili在我看来,至少应该在方法的javadoc中声明运行时异常。在签名中声明它会更加明显,在出现问题时可能发生什么。这是我建议提供此信息的主要原因。
顺便说一下,随着时间的推移(现在是2017年),我现在更倾向于仅在javadoc中记录它们,并尽可能避免使用受检异常。
在我看来,未经检查的异常不应该在方法签名中声明,因为这与它们的本质相反。
然而,如果一个方法可能会抛出一些未经检查的异常,在 Javadoc 的 @throws 中注明可能的情况,对于调用该方法的其他人理解可能出现的问题是有帮助的。但是,这仅对调用者可能能够处理的异常有用(例如由于错误输入导致的 NPE 等)。
如果您正在编写供他人使用的 API,则有充分的理由在 API 中明确记录您的意图,并且在方法签名中声明 RuntimeExceptions 没有任何不利影响。