什么时候抛出非法状态异常与非法争议异常?

让我们从Javadocs开始:

非法状态异常

在非法或不适当的时间调用方法的信号。换句话说,Java 环境或 Java 应用程序未处于适合所请求操作的状态。

非法争议异常

抛出以指示方法已通过非法或不适当的参数。

上述问题是它们非常黑白分明。考虑一个用例,其中方法正在分析调用方提供的文件。该文件存在、可读且格式正确。但是,文件中的某些内容不符合业务规则。在这种情况下,什么是适当的异常 - 或者?IllegalStateExceptionIllegalArgumentException

查看提供断言的各种库,如番石榴前提条件或Spring Assert,似乎没有共识。这里这里都有一些很好的讨论,但没有一个为我上面提到的常见用例提供结论性的答案。


答案 1

换句话说:

在类型被接受但不接受值的情况下,将抛出 ,例如期望正数,并且您给出负数。IllegalArgumentException

当调用方法时,当它不应该调用时,就像从死线程调用方法一样,会引发 。IllegalStateException

我不明白他们怎么能混合。在你关于有问题的文件的问题中,我认为抛出a或an会更合适。ParseExceptionIOException


答案 2

IllegalStateException用于编码错误,而不是输入错误。它适用于当类的不变量被违反时,或者当对象处于错误状态时调用方法。例如,使用已关闭的资源,或关闭资源两次。

IllegalArgumentException是指每个方法 API 的参数具有无效值。当只允许正数时传递 -1。

在这种情况下,这两种例外都不合适。我会创建一个子类,因为输入文件中有一个错误。IOException