Java 何时抛出IllegalStateException与IllegalArgumentException?

Java 何时抛出IllegalStateException与IllegalArgumentException?,java,exception,illegalstateexception,illegalargumentexception,Java,Exception,Illegalstateexception,Illegalargumentexception,让我们从Javadocs开始: 表示已以非法或不适当的方式调用方法 时间换句话说,Java环境或Java应用程序不是 处于请求操作的适当状态 抛出以指示方法已通过非法或 不恰当的论点 上面的问题是它们是黑白相间的。考虑一个使用方法分析调用方提供的文件的用例。该文件存在、可读且格式正确。但是,文件中的某些内容不符合业务规则。在这种情况下,应该抛出什么样的异常-IllegalStateException或IllegalArgumentException 看看各种提供断言的库,比如Guava或Sp

让我们从Javadocs开始:

表示已以非法或不适当的方式调用方法 时间换句话说,Java环境或Java应用程序不是 处于请求操作的适当状态

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


上面的问题是它们是黑白相间的。考虑一个使用方法分析调用方提供的文件的用例。该文件存在、可读且格式正确。但是,文件中的某些内容不符合业务规则。在这种情况下,应该抛出什么样的异常-
IllegalStateException
IllegalArgumentException

看看各种提供断言的库,比如Guava或Spring,似乎没有达成共识。有一些很好的讨论和讨论,但没有一个能对我上面提到的常见用例提供结论性的答案


免责声明:我理解我没有显示一些代码,但是我相信这是一个考虑好API设计的具体和实际的问题。让我们暂时假设我们回到了stackoverflow的好时光,那时人们乐于讨论务实的问题,而不是对任何看起来不像家庭作业的事情投反对票。

换句话说:

IllegalArgumentException在接受类型但不接受值的情况下抛出,例如期望正数而给出负数

当一个方法在不应该调用的时候被调用时,就会抛出IllegalStateException,就像从死线程调用一个方法一样

我不明白他们怎么能混在一起。在您关于有问题的文件的问题中,我认为抛出ParseException或IOException更合适

考虑一个用例,其中


如果这是我仅有的两个选项,在您的用例中,我会倾向于
IllegalStateException

为什么??因为参数是有效的,所以它们指向一个可以读取的文件。无效的不是参数,而是解析文件会使状态无效


当然,这是假设您考虑的唯一例外情况是
IllegalStateException
IllegalArgumentException

这当然只是MHO。我认为重要的方面是,您可以以一致的方式定义使用一个异常而不是另一个异常的原因,从而使您的API易于理解


我也同意SACLYR(1的答案),有更多的异常可以用来定义方法调用失败的原因(个人,我想 java .Text .PARSExpExe> <代码>)

<代码> ILLALSTATEExtExe> /Cord>是用于编码错误,而不是输入错误。它用于违反类的不变量,或者在对象处于错误状态时调用方法。例如,使用已关闭的资源,或关闭资源两次

IllegalArgumentException
是指根据方法API,参数具有无效值的情况。仅允许正数时通过-1


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

我还认为这两种方法的语义非常接近

根据
IllegalArgumentException
javadoc,传递无效参数可以通过抛出
IllegalArgumentException
来处理:

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


但是调用带有错误参数的方法也可以通过抛出
IllegalStateException
来处理,因为它的javadoc声明:

表示已以非法或不适当的方式调用方法 时间

实际上,使用不适当或非法的参数调用方法也可能意味着该方法是在非法或不适当的时间调用的


简单地说,我认为一些开发人员可能会以可互换的方式使用
IllegalArgumentException
IllegalStateException
,因为问题是由传递的参数引起的。我上面解释的内容。

IllegalStateException
与传递的参数无关的用例不必与
IllegalArgumentException
交换

虽然细微差别很小,但大多数库有时会混合使用

我恐怕不能给你一个更确切的解释。
语义是语义,因为两件事可以用更接近的方式来解释,所以它通常没有被清楚地使用。

其他答案强调何时使用
IllegalArgumentException
IllegalStateException
。但是在我看来(注意:基于观点的)这些异常不应该在您的用例中使用

总结:某些文件包含有效格式的数据,已成功加载到应用程序中,但某些值不符合您的业务规则(注意:没有IO操作失败,格式有效=>不应使用
IOException
ParseException
,它们表示IO操作失败或格式无效)

为什么不应使用
IllegalArgumentException
? 引发此异常是为了指示某个方法传递了非法或不适当的参数。您可能会争辩说,您有一个方法验证文件,并且该文件中某个字段的值或多个字段的值的组合是非法的,或者不符合您的业务规则。是的,指向您。但是如果您引发
IllegalArgumentException
在这种情况下,您不能将由其他库(或标准库或您自己的代码)引起的
IllegalArgumentException
s分开