Java 抛出的异常类型

Java Type of Exception to Throw

我想了解为什么要抛出某些异常。我选择扔哪个有什么关系?

例如

//simple division method - a/b
public static double divide(double a, double b){
    if(b == 0)
        throw new IllegalArgumentException("b = 0");
    return a/b;
}

//simple division method - a/b
public static double divide(double a, double b){
    if(b == 0)
        throw new IllegalArithmeticException("b = 0");
    return a/b;
}

(如果代码中有错误,我深表歉意 - 我很快就把它放在一起了。我实际上对方法本身并不感兴趣。)

我选择哪个例外重要吗?它似乎可以是任何东西——即使我使用了 arrayIndexOutOfBoundsException,它仍然会停止程序并打印我想要它打印的内容。

感谢您的帮助。

嗯,从公司的角度来看,抛出什么异常并不重要。因为从技术上讲,您为用户创建程序来处理它,如果用户输入不需要的输入,那么 he/she 将能够得到 he/she 所犯的错误。 它作为用户纠正错误的注释。

值得讨论已检查异常和未检查异常之间的区别是什么,以明确抛出异常的关键点。

假设您正在尝试读取一个文件,但由于某种原因找不到该文件。 Java 有一个方便的 FileNotFoundException ,您可以使用它来明确通知找不到文件。它也是扩展(通过其层次结构)Exception 的异常之一,这意味着如果一个方法声明抛出此异常,则它 必须 通过捕获它来处理或宣布将其扔到别处。

然后是 ArithmeticException,这是一个运行时异常(它扩展了 RuntimeException)- 没有方法需要声明它被抛出,并且您不需要显式捕获它,因为这个 class 异常表明代码中有错误。它可能会出现,实际上,如果有任何东西试图捕获运行时异常,它看起来有点可疑。

在您的问题的上下文中,您基本上是通过预先警告用户有效输入来踩踏 ArithmeticException 的自然抛出。做这样的事情可能是可以接受的,但对于这种情况,你实际上不需要自己扔任何东西。 如果有人决定将 b = 0 传递给方法,他们会得到 ArithmeticException.

存在基于例外情况的现有约定 - 尽可能具体地说明问题,并在适当时提供恢复方法 - 因此在这种情况下,如果您 抛出一个特定的异常,我建议 IllegalArgumentException,因为参数 b = 0 在除法或做模运算时是不可接受的。但是,我还建议改为在 outside 方法中捕获它,因为输入确实值得怀疑,并且在进入此方法之前最好对其进行清理。