抛出set方法的最佳例外

时间:2011-09-07 12:52:09

标签: java exception

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

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

3 个答案:

答案 0 :(得分:38)

我会去IllegalArgumentException

  

抛出表示某个方法已被传递为非法或   不恰当的论点。

修改

另一个注意事项:

而不是

if (conditionIsTrue) {
  doThis();
  doThat();
} else { 
  throw new IllegalArgumentException();
}

写:

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

doThis();
doThat();

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

答案 1 :(得分:10)

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

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

InvalidArgumentException.throwIfNullOrBlank(someString, "someString");

VS

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

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

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

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

答案 2 :(得分:5)

如果该号码是索引,您可以使用IndexOutOfBoundsException。否则,正如奥利弗所说,IllegalArgumentException

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