约书亚·布洛赫(Joshua Bloch)在他的《有效Java》中写道:
“使用Javadoc @throws标记来记录方法可以抛出的每个未经检查的异常,但是请不要使用throws关键字在方法声明中包括未经检查的异常。”
听起来确实很合理,但是如何找出我的方法会抛出哪些未经检查的异常?
让我们考虑以下课程:
public class FooClass { private MyClass[] myClass; /** * Creates new FooClass */ public FooClass() { // code omitted // do something with myClass } /** * Performs foo operation.<br /> * Whatever is calculated. * @param index Index of a desired element * @throws HorribleException When something horrible happens during computation */ public void foo(int index) { try { myClass[index].doComputation(); } catch (MyComputationException e) { System.out.println("Something horrible happened during computation"); throw new HorribleException(e); } } }
现在,我记录了HorribleException,但是很明显,foo方法也可以抛出未经检查的 java.lang.ArrayIndexOutOfBoundsException 。代码变得越复杂,就很难考虑该方法可能引发的所有未经检查的异常。我的IDE并没有太大帮助,也没有任何工具。由于我不知道任何工具…
您如何处理这种情况?
仅记录那些您明确抛出自己或正在通过其他方法传递的内容。剩余部分应视为错误,应通过良好的单元测试和编写可靠的代码来修复。
在这种特殊情况下,我ArrayIndexOutOfBoundsException认为 您的代码中 有错误 , 并且我会相应地修复该代码,使其永远不会抛出该错误。即添加检查数组索引是否在范围内,并通过引发异常(由您记录)或采用替代路径来进行相应处理。
ArrayIndexOutOfBoundsException