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

Jac*_*ine 74 java oop exception-handling exception

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

java.lang.SecurityException 
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*bin 63

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

在javadoc中声明它是一种更好的方法,因为它允许某人在认为有必要时处理它,但知道他们可以在需要时忽略它.这使得已选中和未选中之间的分离清晰.

  • 在Spring中,声明方法签名中未经检查的异常开始是一种常见的做法. (5认同)
  • java编译器不会强制您处理声明的RuntimeExceptions.所以你可以声明它们,作为开发人员的"提示".如果JavaDoc是一个更好的地方,这是可以讨论的.关于已检查和未检查的异常这一点非常重要.选中和未选中的例外情况是,Java真正意味着什么(Compiletime-)异常(已选中)和RuntimeExceptions(未选中). (2认同)

Dhe*_*.S. 32

Oracle Java教程:

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

运行时异常可以在程序中的任何地方发生,而在典型的程序中,它们可以非常多.必须在每个方法声明中添加运行时异常会降低程序的清晰度.


Sam*_*num 16

看看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.
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案是对的.您正在谈论Javadoc语句,而关于方法签名中的`throws`的问题.这些都不是一回事.是的,您绝对应该*记录您的API抛出的所有异常,但问题与此无关. (6认同)

Pat*_*sen 8

在我看来,最好至少在方法的javadoc中声明运行时异常.在签名中声明它会使出现问题时可能发生的事情变得更加明显.这是我建议提供此信息的主要原因.

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