是否应该在throws子句中声明IllegalArgumentException?

时间:2014-05-27 17:18:05

标签: java exception

我的理解是IllegalArgumentException不需要抛出,因为它是运行时错误,因此理论上不应该是从中恢复的方法。我的问题是应该它会抛出关闭?我已经尝试过了,它符合两种方式。

投掷

public static void test() throws IllegalArgumentException
{
    throw new IllegalArgumentException();
}

没有投掷

public static void test()
{
    throw new IllegalArgumentException();
}

6 个答案:

答案 0 :(得分:2)

正如其他人所评论的那样,由于IllegalArgumentException扩展RuntimeException,因此严格来说没有必要,即未经检查的例外。但是,通过向Javadoc添加@throws来记录此行为被认为是一种好习惯,特别是如果您正在开发将由其他人使用的库。例如,看一下java.util.List接口的get(int index)方法的声明:

/**
 * Returns the element at the specified position in this list.
 *
 * @param index index of the element to return
 * @return the element at the specified position in this list
 * @throws IndexOutOfBoundsException if the index is out of range
 *         (index < 0 || index >= size())
 */
E get(int index);

请注意,方法签名没有throws子句。

答案 1 :(得分:1)

可能会抛出运行时异常,但实际上并不需要它。 另一方面,如果在方法的主体中抛出的Checked Exceptions应该在该方法的签名中声明。在这种情况下,不声明“throws”的方法将无法编译。

对于运行时异常尝试调用测试方法,您将看到在所有情况下都抛出异常。

public static void main(String[] args){
YourClass.test();
}

答案 2 :(得分:1)

如果您的功能有&#34;合同&#34;并检查传入的参数,它可以是一个有用的提醒。 e.g。

public double squareRoot(double x) throws IllegalArgumentException {
  if (x < 0.0) 
     throw new IllegalArgumentException();

  happy path code here...
}

这个行为也应该是带有@throws子句的javadoced(是一个单词?)。 (如@matsev所述)

答案 3 :(得分:0)

不需要抛出?或表示在签名中抛出?

在运行时异常的情况下,这是文档样式的问题。它不需要需要,但如果不是,则应手动记录RTE的可能性,而不是依赖于自动生成Javadoc。

答案 4 :(得分:0)

正如你所指出的那样,没有真正需要它。

虽然我通常不这样做,但我看到一些项目有一个约定来声明运行时异常方法可能只是为了引起对这种可能性的注意,并提示程序员使用这些方法来处理所述异常。就个人而言,我发现在一个方法的javadoc中注意和解释这些异常更有效,但这一切都归结为一个品味问题。

答案 5 :(得分:0)

我发现即使是未经检查的异常也很有用。有必要吗?不,但是也没有缩进你的代码。但是很高兴知道可以抛出什么样的异常(特别是如果你使用的第三方库不能使源代码可用),那么你可以对不同类型的异常进行优雅的错误处理,而不是一张毯子catch Throwable就在那里打印出“哎呀出了问题”。到日志。这很少有用。