例如,框架/ JDK中的许多方法可能会抛出
java.lang.SecurityException
但这未在方法签名中指出(因为这通常是为检查的异常保留的做法)。我想证明在方法sigs中声明RuntimeExceptions有很多好处(例如类似于静态类型检查)。我喝醉了还是其他?
Answers:
我不会在签名中声明未经检查的异常,因为它会误导该API的用户。是否必须显式处理该异常不再明显。
在javadoc中声明它是一种更好的方法,因为它允许某人在认为有必要的情况下对其进行处理,但知道他们可以根据需要忽略它。这样可以清除已选中和未选中之间的分隔。
“如果很好地记录一个方法的API,包括它可能抛出的异常,为什么不还要指定运行时异常呢?” 运行时异常表示由编程问题引起的问题,因此,无法合理地期望API客户端代码从它们中恢复或以任何方式进行处理。这些问题包括算术异常,例如除以零;指针异常,例如尝试通过空引用访问对象;以及索引异常,例如尝试通过太大或太小的索引访问数组元素。
运行时异常可能会在程序中的任何位置发生,在典型情况下,异常可能非常多。必须在每个方法声明中添加运行时异常会降低程序的清晰度。
看看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引发的所有异常,但是问题不在于此。