让我们从Javadocs开始:
非法国家例外
表示在非法或不适当的时间调用了方法。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。
异常
抛出以指示方法已传递非法或不适当的参数。
上面的问题是,它们非常黑白分明。考虑一个用例,其中方法正在解析调用方提供的文件。该文件存在、可读且格式正确。但是,文件中的某些内容不符合业务规则。在这种情况下,什么是合适的异常抛出-IllegalStateExc0019
或IllegalArgumentExc0019
?
看看提供断言的各种库,比如Guava Premissions或Spring Assert,似乎没有达成共识。这里和这里都有一些很好的讨论,但是没有一个能为我上面提到的常见用例提供一个结论性的答案。
IllegalStateException
用于编码错误,而不是输入错误。它用于违反类的不变量,或者在对象处于错误状态时调用方法。例如,使用已关闭的资源,或关闭资源两次。
IllegalArgumentExc0019
是指参数在方法API中具有无效值。当只允许正数时传递-1。
在这种情况下,两种例外都不合适。由于输入文件中存在错误,我将创建一个IOExc0019
的子类。
其他答案强调何时使用IllegalArgumentException
或IllegalStateException
。但是在我看来(注意:基于观点的)这些异常不应该在您的用例中使用。
总结一下:有些文件包含有效格式的数据,成功加载到应用程序中,但有些值不符合您的业务规则(注意:没有IO操作失败,格式是有效的=
引发此异常是为了指示方法已传递非法或不适当的参数。您可以辩称,您有一个验证文件和一个字段的值或该文件中几个字段的值组合的方法是非法的或不符合您的业务规则。是的,指向你。但是,如果在这种情况下抛出一个IllegalArgumentExc0019
,则不能将由其他库(或标准库或您自己的代码在其他地方)引起的IllegalArgumentExc0019
与您的验证器中指示很容易违反业务规则(当然,您可以子类IAE并在调用方法中捕获它)。
为什么要把这些例外分开?用例:应该向用户展示违反业务规则的情况,以便他可以更改不符合的输入。其他IAE的或一般的任何未捕获的运行时异常指示例如服务器上的请求失败。在这些情况下,您必须向客户发送不同的响应。
您可以以类似的方式讨论为什么不应该使用IllegalStateExcema
s来指示违反业务规则。那么,在你的用例中应该使用什么?这在很大程度上取决于应用程序的规模。某些自定义子类的RuntimeExcema可能会为小型应用程序执行任务。对于较大的应用程序,像“javax.validation”这样的验证库值得一试。
换言之:
如果接受类型但不接受值,则会抛出IllegalArgumentException
,例如需要正数,而给出负数。
当一个方法在不应该调用的时候被调用时,就会抛出IllegalStateException
,就像从死线程调用一个方法一样。
我不明白他们怎么能混在一起。在您关于有问题的文件的问题中,我认为抛出ParseException
或IOException
更合适。
所以,我现在正在学习如何使用vertx,并尝试在get请求中提供html文件。当我在本地主机上实际执行请求时,它会为文件提供服务,但在控制台中,我得到了错误: IllegalStateException:响应已经写入 这是我的代码: 我的文件树如下所示: 知道为什么会这样吗?谢谢
编辑:我还尝试打印出,它表示有1。
我对使用异常感到困惑: IllegalStateExcture vs Unsupport tedoperationExcture。 我有一个delete方法,在某些情况下是不允许使用的:比方说,当调用方拥有有效数据时。 然后我应该给用户一个异常信息,他现在正在做一个无效的操作。 那么,我应该抛出哪个例外?IllegalStateExcema或Unsupport tedoperationExc农田。
问题内容: TL; DR MatcherAPI 的设计决策是什么? 背景 Matcher有我意想不到的行为,而我找不到很好的理由。API文档说: 创建后,可以使用匹配器执行三种不同类型的匹配操作:这些方法中的每一个都返回一个指示成功或失败的布尔值。通过查询匹配器的状态,可以获得有关成功匹配的更多信息。 API文档进一步说明了: 匹配器的显式状态最初是不确定的。在成功匹配之前尝试查询它的任何部分都将