抛出RuntimeException的方法应该在方法签名中指明它吗?

例如,框架/ JDK中的许多方法可能会抛出

java.lang.SecurityException 

但是这在方法签名中没有被指出(因为这是通常为检查exception保留的做法)。 我想争辩说,在方法sigs中声明RuntimeExceptions有很多好处(类似于静态types检查)。 我喝醉了吗?

我不会在签名中声明一个未经检查的exception,因为它误导了该API的用户。 是否明确处理例外情况已不再明显。

在javadoc中声明它是一个更好的方法,因为如果他们认为这是必要的,它允许某人处理它,但是知道如果他们愿意,他们可以忽略它。 这使清除和未清除之间的分离。

从Oracle Java教程 :

“如果logging一个方法的API非常好,包括它可以抛出的exception,为什么不指定运行时exception呢? 运行时exception表示由于编程问题而导致的问题,因此API客户端代码不能合理地从它们中恢复或以任何方式处理它们。 这样的问题包括算术例外,例如除以零; 指针exception,比如试图通过空引用访问一个对象; 和索引exception,比如试图通过太大或太小的索引访问数组元素。

运行时exception可以发生在程序中的任何地方,而在典型的情况下,它们可能非常多。 不得不在每个方法声明中添加运行时exception都会降低程序的清晰度。

看看collections#add的javadoc

有一大堆未经检查的exception提到:

 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. 

如果你有耐心,我build议彻底logging你的方法抛出的可能的exception。 从某种意义上说,对未经检查的exception做这件事更为重要,因为检查的exception有些自我logging(编译器强制调用的代码来确认它们)。

在我看来,最好至less在javadoc中声明运行时exception。 在签名中声明它会使事情变得更糟。 这是我build议提供这些信息的主要原因。

供参考:随着时间的推移(现在在2017年),我现在更倾向于将它们logging在javadoc中,并尽可能避免检查exception。

在我看来,不应该在方法签名中声明未经检查的exception,因为这与它们的性质相悖。

但是,如果一个方法可能会抛出一些未经检查的exception,注意到Javadoc中@throws的可能情况可能有助于其他人调用该方法来理解可能出错的方法。 这仅仅对于调用者可能能够处理的exception(例如由于不良input的NPE等)而言是有用的。

如果你正在编写一个供其他人使用的api,那么在api中显式的logging你的意图是有充分的理由的,并且在方法签名中声明RuntimeExceptions没有缺点。

这与关于检查exception的讨论有关。 大多数人会同意不应该在方法签名中声明exception。

还有关于如何使用运行时exception的讨论 。 我同意一个海报,运行时exception应该表示编程错误或致命的条件。 所以在签名上宣布他们没有太大的价值。 每种方法都可能通过一种方法。