Java 异常抛出-用法

Java 异常抛出-用法,java,exception-handling,Java,Exception Handling,要求用户从某个给定集合中选择一个ID。我检查该ID是否存在于我的集合中,如果不存在,我抛出IndexOutOfBoundsException并稍后捕获它。我真的可以将该异常用于此目的吗?还是这只是一种非常糟糕的做法?如果将ID作为参数传递给一个方法,并且您希望将其作为前置条件的一部分进行检查,那么您可以抛出IllegalArgumentException或运行时异常 IndexOutOfBounds没有意义,因为这里很混乱。执行越界访问时会引发异常如果将ID作为参数传递给方法,并且您希望将其作为

要求用户从某个给定集合中选择一个ID。我检查该ID是否存在于我的集合中,如果不存在,我抛出
IndexOutOfBoundsException
并稍后捕获它。我真的可以将该异常用于此目的吗?还是这只是一种非常糟糕的做法?

如果将
ID
作为参数传递给一个方法,并且您希望将其作为前置条件的一部分进行检查,那么您可以抛出
IllegalArgumentException
运行时异常


IndexOutOfBounds
没有意义,因为这里很混乱。执行越界访问时会引发异常

如果将
ID
作为参数传递给方法,并且您希望将其作为前置条件的一部分进行检查,则可以引发
IllegalArgumentException
运行时异常


IndexOutOfBounds
没有意义,因为这里很混乱。当您进行越界访问时会引发异常

如果您面临真正的异常情况,抛出异常确实有意义

如果类的契约假设用户永远不会查询不在集合中的值,则异常是好的。也许是IllegargumentException或类似的东西

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

所以,抛出异常还是返回一些预定义值是一种折衷


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

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

如果类的契约假设用户永远不会查询不在集合中的值,则异常是好的。也许是IllegargumentException或类似的东西

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

所以,抛出异常还是返回一些预定义值是一种折衷


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

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


如果API有一个约定,指定返回有效对象或抛出异常,然后抛出异常。如果有意义的话,也要考虑一个nulLoopDip模式。 取决于上下文,但在我看来,如果您查找的是一个ID,一个与位置引用无关的概念,这将是对特定异常的滥用——可能是特定于应用程序的ItemNotFound或等效项


如果API有一个约定,指定返回有效对象或抛出异常,然后抛出异常。如果有意义的话,也要考虑一个nulLoopDip模式。 如果调用适用于
23
,调用适用于
47
,并且在此期间没有任何更改,那么它不适用于
35
的原因不可能是索引超出了范围。

如果调用适用于
23
,调用适用于
47
,并且在此期间没有任何更改,那么它不适用于
35
的原因不可能是索引超出了范围。

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

initCause
并将其设置为IllegalArgumentException

比如说

public method(int i) throws MyException {
    if (i < 0) {
       MyException e = new MyException();
       e.initCause(new IllegalArugmentException());
       throw e;
    }
}
public方法(inti)抛出MyException{
if(i<0){
MyException e=新的MyException();
e、 initCause(新的illegalarumentexception());
投掷e;
}
}

我可能还会调用正确的corecoctor,以便在抛出异常时将消息传递给该corecoctor,这很清楚发生了什么。

就我个人而言,我会抛出一个选中的异常,以便强制调用方法捕获它。你能做的就是打电话

initCause
并将其设置为IllegalArgumentException

比如说

public method(int i) throws MyException {
    if (i < 0) {
       MyException e = new MyException();
       e.initCause(new IllegalArugmentException());
       throw e;
    }
}
public方法(inti)抛出MyException{
if(i<0){
MyException e=新的MyException();
e、 initCause(新的illegalarumentexception());
投掷e;
}
}

我可能还会调用正确的corecoctor,以便在抛出异常时将消息传递给该corecoctor,很明显发生了什么。

ID作为参数传递。然后我做了一些事情来确定它是否在集合中,如果不是,我抛出异常。现在我认为只有在执行函数之前明确知道哪些值是不允许的,比如null,我才能抛出该异常。所以在我的例子中,我可能无法使用它。ID作为参数传递。然后我做了一些事情来确定它是否在集合中,如果不是,我抛出异常。现在我认为只有在执行函数之前明确知道哪些值是不允许的,比如null,我才能抛出该异常。所以在我的情况下,我可能无法使用它。