一尘不染

您如何记录未检查的异常?

java

约书亚·布洛赫(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并没有太大帮助,也没有任何工具。由于我不知道任何工具…

您如何处理这种情况?


阅读 197

收藏
2020-12-03

共1个答案

一尘不染

仅记录那些您明确抛出自己或正在通过其他方法传递的内容。剩余部分应视为错误,应通过良好的单元测试和编写可靠的代码来修复。

在这种特殊情况下,我ArrayIndexOutOfBoundsException认为 您的代码中 有错误
并且我会相应地修复该代码,使其永远不会抛出该错误。即添加检查数组索引是否在范围内,并通过引发异常(由您记录)或采用替代路径来进行相应处理。

2020-12-03