2012-09-03 113 views
0

要求用户从某个给定集合中选择一个ID。我检查我的收藏中是否存在该ID,如果不是,我会抛出IndexOutOfBoundsException并在稍后抓到它。我是否可以将这种例外情况用于此目的,还是仅仅是一种非常糟糕的做法?抛出异常 - 使用

回答

1

抛出异常没有什么意义,如果你面对的真正特殊情况

如果你的类的合同假设不是用户从不查询不在值引发异常收集,那么异常是好的。也许IllegalArgumentException或类似的东西。

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

所以它是一种权衡是否抛出异常,或者返回一些预先定义的值

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

2

如果将ID作为参数传递给某个方法,并且希望将其作为事前条件的一部分进行检查,则可以输入IllegalArgumentExceptionRuntimeException
IndexOutOfBounds没有意义,因为它在这里很混乱。这是当你做一个访问越界

+0

ID作为参数传递。比我做一些东西,看看它是否在集合中,如果不是我抛出异常。现在,我认为只有在执行函数之前,我明确知道什么值不允许为null之类的情况下,我才可以抛出该异常。所以在我的情况下,我可能无法使用它。 – lunar

0

取决于上下文,但是IMO如果要查找ID,这个概念不与位置参考绑定,这可能是特定应用异常–的滥用,也可能是特定于应用的ItemNotFound或等价物。

如果您的API有一个合约,指定您要么返回一个有效的对象,要么抛出一个异常,然后抛出异常。如果有意义,也可以考虑使用NullObject模式。

0

如果调用工程23和呼叫工程47,并没有在此期间改变,那么它不会为35工作原因不能是一个指数是出界。

1

就我个人而言,我会抛出一个检查异常,所以调用方法被迫抓住它。你可以做的是叫

initCause 

异常,并设置这是抛出:IllegalArgumentException

例如

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

我可能还调用正确的corectors的消息传递给当抛出异常,清楚发生了什么事情。