抛出set方法的最佳例外

xde*_*000 19 java exception

如果我有一个set方法,我想修改一些值,如果用户输入错误的值,这是抛出指示失败的最佳例外?

public void setSomething(int d) throws ....
{
    if (d < 10 && d >= 0)
    {
        // ok do something
    }
    else throw new ... // throw some exception
}
Run Code Online (Sandbox Code Playgroud)

hel*_*hod 39

我会去IllegalArgumentException.

抛出以指示方法已被传递非法或不适当的参数.

编辑

另一个说明:

代替

if (conditionIsTrue) {
  doThis();
  doThat();
} else { 
  throw new IllegalArgumentException();
}
Run Code Online (Sandbox Code Playgroud)

写:

if (conditionNotTrue) {
    throw new IllegalArgumentException();
}

doThis();
doThat();
Run Code Online (Sandbox Code Playgroud)

(虽然这个建议可能有争议;-)).

  • '另一个音符'的+1 - 此表格称为[保护条款](http://c2.com/cgi/wiki?GuardClause).就个人而言,我甚至会省去其中的花括号,并使其成为一个单行. (8认同)
  • [杰夫阿特伍德的力量迫使你!](http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html) (5认同)

Kev*_*dge 10

我同意@Code Monkey关于创建自己的InvalidArgumentException,但他的实现没有显示它提供的所有优点.

1)您可以添加便捷方法来简化参数检查.例如:

InvalidArgumentException.throwIfNullOrBlank(someString, "someString");
Run Code Online (Sandbox Code Playgroud)

if (someString == null || someString.trim().isEmpty()) {
    throw new IllegalArgumentException("someString is null or blank");
}
Run Code Online (Sandbox Code Playgroud)

2)您可以编写确认哪个参数无效的单元测试.如果抛出IllegalArgumentException,则单元测试无法确认是否因为您希望抛出它而抛出它.你甚至不能说它是由你自己的代码抛出的.

try {
    someClass.someMethod(someValue);
    Assert.fail("Should have thrown an InvalidArgumentException");
} catch (InvalidArgumentException e) {
    Assert.assertEquals("someValue", e.getArgumentName());
}
Run Code Online (Sandbox Code Playgroud)

3)您可以在自己的代码中告诉异常.(这是一个没有太多实际优势的小问题)


Tom*_*son 5

如果数字是索引,则可以使用IndexOutOfBoundsException。否则,如Oliver所说,IllegalArgumentException

不要害怕创建IllegalArgumentException的子类来更精确地解决问题。为IllegalArgumentException编写的任何catch块仍将捕获它,但是堆栈跟踪将提供更多信息。