0

要求用户从某个给定集合中选择一个 ID。我检查该 ID 是否存在于我的收藏中,如果不存在,我IndexOutOfBoundsException稍后将其扔掉并抓住它。我实际上可以为此目的使用该异常还是只是一种非常糟糕的做法?

4

5 回答 5

2

如果ID作为参数传递给方法,并且您想将其作为前置条件的一部分进行检查,您可以抛出 anIllegalArgumentExceptionRuntimeException.
IndexOutOfBounds没有意义,因为它在这里令人困惑。这是当您越界访问时引发的异常

于 2012-09-03T21:06:01.067 回答
1

如果您面临非常特殊的情况,抛出异常确实很有意义

如果您的班级合同假设用户永远不会查询不在集合中的值,那么例外是好的。也许 IllegalArgumentException 或类似的东西。

否则会导致样板代码,有时由于堆栈展开和异常传播而导致性能显着下降

所以这是一种权衡是抛出异常还是返回一些预定义的值

我建议在您的情况下返回“null”。

于 2012-09-03T21:06:25.650 回答
1

就我个人而言,我会抛出一个检查异常,因此调用方法被迫捕获它。你能做的就是打电话

initCause

在异常上并将其设置为 IllegalArgumentException

例如

public method(int i) throws MyException {
    if (i < 0) {
       MyException e = new MyException();
       e.initCause(new IllegalArugmentException());
       throw e;
    }
}

我可能还会调用正确的辅助器来传递消息,以便在抛出异常时很清楚发生了什么。

于 2012-09-03T21:10:38.740 回答
0

取决于上下文,但 IMO 如果您正在查找一个 ID,一个与位置引用无关的概念,这将是对该特定异常的滥用——可能是特定于应用程序的 ItemNotFound 或等效项。

如果您的 API 具有指定您将返回有效对象或引发异常的协定,则引发异常。如果有意义,也可以考虑使用 NullObject 模式。

于 2012-09-03T21:07:16.920 回答
0

如果调用适用于23并且调用适用于47,同时没有任何变化,那么它不起作用的原因35不能是索引超出范围。

于 2012-09-03T21:08:59.350 回答