当前位置: 首页 > 知识库问答 >
问题:

何时抛出IllegalStateException与IllegalArgumentException?

王飞虎
2023-03-14

让我们从Javadocs开始:

非法国家例外

表示在非法或不适当的时间调用了方法。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。

异常

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

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

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

共有3个答案

狄河
2023-03-14

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

IllegalArgumentExc0019是指参数在方法API中具有无效值。当只允许正数时传递-1。

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

薛华奥
2023-03-14

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

总结一下:有些文件包含有效格式的数据,成功加载到应用程序中,但有些值不符合您的业务规则(注意:没有IO操作失败,格式是有效的=

引发此异常是为了指示方法已传递非法或不适当的参数。您可以辩称,您有一个验证文件和一个字段的值或该文件中几个字段的值组合的方法是非法的或不符合您的业务规则。是的,指向你。但是,如果在这种情况下抛出一个IllegalArgumentExc0019,则不能将由其他库(或标准库或您自己的代码在其他地方)引起的IllegalArgumentExc0019与您的验证器中指示很容易违反业务规则(当然,您可以子类IAE并在调用方法中捕获它)。

为什么要把这些例外分开?用例:应该向用户展示违反业务规则的情况,以便他可以更改不符合的输入。其他IAE的或一般的任何未捕获的运行时异常指示例如服务器上的请求失败。在这些情况下,您必须向客户发送不同的响应。

您可以以类似的方式讨论为什么不应该使用IllegalStateExcemas来指示违反业务规则。那么,在你的用例中应该使用什么?这在很大程度上取决于应用程序的规模。某些自定义子类的RuntimeExcema可能会为小型应用程序执行任务。对于较大的应用程序,像“javax.validation”这样的验证库值得一试。

羊舌青青
2023-03-14

换言之:

如果接受类型但不接受值,则会抛出IllegalArgumentException,例如需要正数,而给出负数。

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

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

 类似资料: