代码之家  ›  专栏  ›  技术社区  ›  Xorty

如何记录未检查的异常?[关闭]

  •  23
  • Xorty  · 技术社区  · 14 年前

    Joshua Bloch在他的高效Java中写道:

    “使用Javadoc@throws标记记录每个未检查的异常 方法可以抛出,但不要使用throws关键字包含unchecked 方法声明中的异常。“

    好吧,这听起来确实合理,但如何找出,我的方法可以抛出什么未经检查的异常?

    让我们想想下面的一节课:

    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);
            }
        }
    }
    

    现在,我记录了可怕的异常,但很明显,foo方法也可以抛出unchecked . 代码越复杂,就越难想到该方法可以抛出的所有未检查的异常。我的IDE在这方面对我帮助不大,也没有任何工具。因为我不知道用什么工具。。。

    你如何处理这种情况?

    5 回复  |  直到 14 年前
        1
  •  15
  •   BalusC    14 年前

    在这种特殊情况下,我想 ArrayIndexOutOfBoundsException 像虫子一样 在你的代码里 我会相应地修改代码,使它不会抛出它。例如,添加一个检查数组索引是否在范围内,并通过抛出一个异常(您记录了该异常)或采用另一个路径进行相应的处理。

        2
  •  2
  •   Vivien Barousse    14 年前

    代码越复杂,就越难想到该方法可以抛出的所有未检查的异常。

    在你的例子中,我建议把 ArrayIndexOutOfBoundsException . 只是因为当给方法提供一个坏参数时,有人可能会这样做,而且应该写在某个地方:“如果给了一个无效的数组索引,就会得到一个 String#charAt() IndexOutOfBoundException

    一般来说,您不应该记录所有可能出现的异常。你不能预测所有的,你很可能会忘记一个。所以,记录那些显而易见的,你想到的。尽量列出最多的例外情况,但不要花太多时间。毕竟,如果您忘记了一个应该记录的文档,您可以稍后改进您的文档。

        3
  •  1
  •   mhaller    14 年前

    只记录你自己在做什么。

    throw IllegalArgumentException("Index must be smaller than " +myClass.length + ", but is: " + index) 然后记录 非法数据异常 在JavaDoc中。

        4
  •  0
  •   Martijn Courteaux    14 年前

    如果你想成为一个理想的程序员,你所发布的引语就是你必须记住的。编程不是思考“什么会出错”,而是思考如何用最好的方式做某事并编程。如果是个人项目,只需写下方法的作用。

    • 不要记录该方法。
    • 仔细想想你的代码做了什么,找出最常见的未检查异常是什么。将它们添加到Java文档中。如果你遇到了一个新的问题,找出问题所在,并将其添加为可能的例外。
    • 不要关心可能的例外情况,只记录例外情况 抛出方法体(例如: if (obj == null) { throw new NullPointerException(); }
        5
  •  0
  •   Horcrux7    14 年前

    我们有一个在测试服务器上运行的书面checkstyle扩展。在您的示例中,它将测试是否记录了可怕的异常。

    ArrayIndexOutOfBoundsException将通过代码复查进行检测。在示例代码中,我们的目标要求抛出InvalidArgumentException,而不是ArrayIndexOutOfBoundsException。它的文档可以在测试服务器上找到。

    ArrayIndexOutOfBoundsException在FindBugs中可能是一个警告。但我不确定。