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


86

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

java.lang.SecurityException 

但这未在方法签名中指出(因为这通常是为检查的异常保留的做法)。我想证明在方法sigs中声明RuntimeExceptions有很多好处(例如类似于静态类型检查)。我喝醉了还是其他?

Answers:


70

我不会在签名中声明未经检查的异常,因为它会误导该API的用户。是否必须显式处理该异常不再明显。

在javadoc中声明它是一种更好的方法,因为它允许某人在认为有必要的情况下对其进行处理,但知道他们可以根据需要忽略它。这样可以清除已选中和未选中之间的分隔。


4
Java编译器不会强迫您处理声明的RuntimeExceptions。因此,您可以声明它们,以作为开发人员的“提示”。如果JavaDoc更适合这样做,这是可以讨论的。关于已检查和未检查的异常的要点很重要。被检查和未被检查的异常是Java真正具有(Compiletime-)Exceptions(被检查)和RuntimeExceptions(未被检查)的含义。
Guardian667

5
在Spring中,在方法签名中声明未检查的异常是一种常见的做法。
纳斯卡

38

Oracle Java教程

“如果很好地记录一个方法的API,包括它可能抛出的异常,为什么不还要指定运行时异常呢?” 运行时异常表示由编程问题引起的问题,因此,无法合理地期望API客户端代码从它们中恢复或以任何方式进行处理。这些问题包括算术异常,例如除以零;指针异常,例如尝试通过空引用访问对象;以及索引异常,例如尝试通过太大或太小的索引访问数组元素。

运行时异常可能会在程序中的任何位置发生,在典型情况下,异常可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。


因此,编译器不需要捕获或指定运行时异常(尽管可以)。
纳斯卡

18

看看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.

如果您有耐心,建议您以这种方式彻底记录您的方法抛出的可能异常。在某种程度上,对未检查的异常执行此操作甚至更为重要,因为已检查的异常在某种程度上是自我记录的(编译器强制调用代码对其进行确认)。


6
这个答案是错误的。您正在谈论Javadoc语句,而throws方法签名中的问题。这些不是一回事。是的,您绝对应该记录API引发的所有异常,但是问题不在于此。
吉利

8

以我的观点,最好至少在该方法的javadoc中声明运行时异常。在签名中声明它可以使您更清楚地知道出问题时可能发生的情况。这是我建议提供此信息的主要原因。

仅供参考:随着时间的推移(现在是2017年),我现在更多地倾向于仅在javadoc中进行记录,并尽可能避免检查异常。


3

在我看来,绝对不要在方法签名中声明未检查的异常,因为这与它们的性质相反。

但是,如果某个方法可能引发一些未经检查的异常,请注意Javadoc中@throws中的可能情况,则可能有助于其他人调用该方法以了解可能出问题的地方。尽管仅对于呼叫者可能能够处理的异常(例如,由于输入错误而导致的NPE等),这才有用。


3

如果您要编写供他人使用的api,则有足够的理由在api中明确记录您的意图,并且在方法签名中声明RuntimeExceptions也没有不利之处。


1

这与有关检查异常的讨论有关。大多数人都同意不应在方法签名中声明异常。

讨论了如何使用运行时异常。我同意一个发帖人的观点,即运行时异常应表示编程错误或致命状况。因此,在签名中声明它们没有太多优点。每种方法都可能通过一种方法。


解析异常或某些其他数据验证类型异常在哪里适合。您是在暗示不应使用检查的异常,而应限制要使用的未检查的异常。
罗宾

1
我的意思是,不应强迫开发人员捕获已检查的异常。因此,无需在方法签名中声明它们。在Java中,您可以像Spring一样在运行时异常中转换它们。我还要说的是,运行时异常仅应在不可恢复的情况下引发。
kgiannakakis,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.