Java IllegalArumentException是否应该在抛出条款中声明?

Java IllegalArumentException是否应该在抛出条款中声明?,java,exception,Java,Exception,我的理解是,不需要抛出IllegalArgumentException,因为这是一个运行时错误,因此理论上不应该有从中恢复的方法。我的问题是,它应该被扔在掷近吗?我已经试过了,它是双向的 投掷 public static void test() throws IllegalArgumentException { throw new IllegalArgumentException(); } 不投 public static void test() { throw new Ill

我的理解是,不需要抛出IllegalArgumentException,因为这是一个运行时错误,因此理论上不应该有从中恢复的方法。我的问题是,它应该被扔在掷近吗?我已经试过了,它是双向的

投掷

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

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

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

对于尝试调用测试方法的运行时异常,您将看到在所有情况下都会引发异常

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

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

对于尝试调用测试方法的运行时异常,您将看到在所有情况下都会引发异常

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

不需要扔掉吗?或者在签名中注明


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

不需要抛出?或者在签名中注明


在运行时异常的情况下,这是文档风格的问题。它不需要声明,但如果没有声明,则应该手动记录RTE的可能性,而不是依靠自动生成Javadoc。

正如您自己所指出的,没有真正的必要


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

正如您自己所指出的,没有真正的必要


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

我发现声明未检查的异常也很有用。有必要吗?没有,但是也没有缩进代码。但是很高兴知道可以抛出哪种类型的异常(特别是如果您使用的第三方库没有提供源代码),这样您就可以对不同类型的异常进行优雅的错误处理,而不是在那里有一个覆盖的
catch Throwable
,只打印“哎哟,出了什么问题。”到日志。这很少有帮助。

我发现声明未经检查的异常也很有用。有必要吗?没有,但是也没有缩进代码。但是很高兴知道可以抛出哪种类型的异常(特别是如果您使用的第三方库没有提供源代码),这样您就可以对不同类型的异常进行优雅的错误处理,而不是在那里有一个覆盖的
catch Throwable
,只打印“哎哟,出了什么问题。”到日志。这很少有帮助。

如果您的函数有一个“约定”并检查传入的参数,那么它可能是一个有用的提醒。e、 g

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

  happy path code here...
}
public双平方根(double x)抛出IllegalArgumentException{
if(x<0.0)
抛出新的IllegalArgumentException();
快乐路径代码在这里。。。
}
这个行为也应该用@throws子句进行javadoced(这是一个单词吗?)。(正如@matsev所指出的)

如果您的函数有一个“契约”并检查传入的参数,那么它可能是一个有用的提醒。e、 g

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

  happy path code here...
}
public双平方根(double x)抛出IllegalArgumentException{
if(x<0.0)
抛出新的IllegalArgumentException();
快乐路径代码在这里。。。
}

这个行为也应该用@throws子句进行javadoced(这是一个单词吗?)。(正如@matsev所指出的)

正如其他人所评论的,这完全没有必要,因为
IllegalArgumentException
扩展了
RuntimeException
,即未经检查的异常。但是,通过向Javadoc添加
@throws
来记录这种行为被认为是一个好习惯,特别是如果您正在开发一个供其他人使用的库。例如,看看
java.util.List
接口的方法声明:

/**
 * 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);
/**
*返回此列表中指定位置的元素。
*
*@param要返回的元素的索引
*@返回此列表中指定位置的元素
*@如果索引超出范围,则引发IndexOutOfBoundsException
*(索引<0 | |索引>=size())
*/
E-get(int-index);

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

正如其他人所评论的,它完全没有必要,因为
IllegalArgumentException
扩展了
RuntimeException
,即未检查的异常。但是,通过向Javadoc添加
@throws
来记录这种行为被认为是一个好习惯,特别是如果您正在开发一个供其他人使用的库。例如,看看
java.util.List
接口的方法声明:

/**
 * 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);
/**
*返回此列表中指定位置的元素。
*
*@param要返回的元素的索引
*@返回此列表中指定位置的元素
*@throws indexootfboundsex