要求用户从某个给定集合中选择一个 ID。我检查该 ID 是否存在于我的收藏中,如果不存在,我IndexOutOfBoundsException
稍后将其扔掉并抓住它。我实际上可以为此目的使用该异常还是只是一种非常糟糕的做法?
5 回答
如果ID
作为参数传递给方法,并且您想将其作为前置条件的一部分进行检查,您可以抛出 anIllegalArgumentException
或RuntimeException
.
IndexOutOfBounds
没有意义,因为它在这里令人困惑。这是当您越界访问时引发的异常
如果您面临非常特殊的情况,抛出异常确实很有意义
如果您的班级合同假设用户永远不会查询不在集合中的值,那么例外是好的。也许 IllegalArgumentException 或类似的东西。
否则会导致样板代码,有时由于堆栈展开和异常传播而导致性能显着下降
所以这是一种权衡是抛出异常还是返回一些预定义的值
我建议在您的情况下返回“null”。
就我个人而言,我会抛出一个检查异常,因此调用方法被迫捕获它。你能做的就是打电话
initCause
在异常上并将其设置为 IllegalArgumentException
例如
public method(int i) throws MyException {
if (i < 0) {
MyException e = new MyException();
e.initCause(new IllegalArugmentException());
throw e;
}
}
我可能还会调用正确的辅助器来传递消息,以便在抛出异常时很清楚发生了什么。
取决于上下文,但 IMO 如果您正在查找一个 ID,一个与位置引用无关的概念,这将是对该特定异常的滥用——可能是特定于应用程序的 ItemNotFound 或等效项。
如果您的 API 具有指定您将返回有效对象或引发异常的协定,则引发异常。如果有意义,也可以考虑使用 NullObject 模式。
如果调用适用于23
并且调用适用于47
,同时没有任何变化,那么它不起作用的原因35
不能是索引超出范围。