Java抛出异常类型

时间:2017-01-10 16:34:50

标签: java exception exception-handling 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;
}

VS

//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,它仍然会停止程序并打印我想要它打印的内容。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

嗯,从公司的角度来看,你投掷的例外情况确实很重要。因为tecnically,你创建程序供用户使用它,如果用户输入不需要的输入,那么他/她将能够得到他/她做出的错误。 它作为一个注释,供用户纠正错误。

答案 1 :(得分:1)

值得讨论的是,检查和未检查的异常之间的区别在于,将要抛出的异常的关键点归结为主。

让我们说您正在尝试阅读文件,无论出于何种原因,都找不到该文件。 Java有一个方便的FileNotFoundException,您可以使用它来明确地通知该文件未找到。它也是扩展(通过其层次结构)Exception的异常之一,这意味着如果方法声明抛出此异常,则必须通过捕获来处理它或宣布它被扔到别处。

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

在你的问题的背景下,你通过预警有效输入的用户基本上踩着ArithmeticException的自然投掷。做这样的事情可能是可以接受的,但是对于这种情况,你实际上并不需要自己扔东西。如果有人决定将b = 0传递给方法,他们将获得ArithmeticException

现有的约定基于异常 - 尽可能具体地说明问题,并提供适当的恢复方法 - 所以在这种情况下,如果你来抛出特定的例外情况,我建议IllegalArgumentException,因为在分割或进行模数时​​,参数b = 0是不可接受的。但是,我还建议将其置于 outside 之外的方法中,因为输入确实是可疑的,并且应该在它进入此方法之前进行理想的清理。 / p>