Java 我应该使用算术异常还是IllegalArgumentException以及什么';有什么不同?

Java 我应该使用算术异常还是IllegalArgumentException以及什么';有什么不同?,java,exception-handling,Java,Exception Handling,如果我有一个方法,比如getFactorial(int n),对于负输入应该失败,那么它应该抛出算术异常还是IllegalArgumentException?负数绝对是非法参数;从算术上讲,它们也是一种无稽之谈。不管是哪种方法,还是它们只是程序员的一个指示,说明为什么该方法不能处理输入?算术异常用于 发生异常算术条件时引发 IllegalArgumentException用于 抛出以指示方法已通过非法或 不恰当的论点 在您的例子中,提供给该方法的参数不正确,因此IllegalArgumentEx

如果我有一个方法,比如
getFactorial(int n)
,对于负输入应该失败,那么它应该
抛出
算术异常
还是
IllegalArgumentException
?负数绝对是非法参数;从算术上讲,它们也是一种无稽之谈。不管是哪种方法,还是它们只是程序员的一个指示,说明为什么该方法不能处理输入?

算术异常
用于

发生异常算术条件时引发


IllegalArgumentException
用于

抛出以指示方法已通过非法或 不恰当的论点


在您的例子中,提供给该方法的参数不正确,因此
IllegalArgumentException
似乎更好


我认为方法中出现的
算术异常
对于那些会产生算术错误的计算更有意义,如果你仅仅通过检查方法条目中的参数就猜不出问题所在。

在这种情况下,应该使用
IllegalArgumentException
,因为您不希望用户向方法传递否定参数(参数)

如果计算值没有意义,则应使用
算术异常

例如,For
算术异常
说明:

发生异常算术条件时引发。例如,一个整数“除以零”抛出该类的一个实例


IllegalArgumentException
,因为发生故障的原因是参数超出了可接受的范围。我想这更有意义,因为您可以“通过检查来猜测问题…”,即使负因子不存在,也可能是算术错误。那么,这只是一个判断调用,关于堆栈跟踪中应该出现什么,即IllegalArgumentException-负阶乘还是算术异常-负阶乘?你完全正确。这是个问题。但是为什么我们要定义特定的异常而不使用泛型异常或运行时异常呢?因为语义很重要。例如,当您得到一个IllegalArgumentException时,您知道问题来自无效的输入。如果合适,您甚至可以捕获异常并向客户机请求另一个输入。当您遇到算术异常时,您知道这是一个算术问题,但不知道该问题是否与无效输入有关。特定的错误源将被算术异常隐藏。