java - IllegalStateException 的预期用途是什么?

标签 java exception illegalstateexception

这是在今天与一位同事的讨论中提出的。

Java 的 IllegalStateException 的 Javadocs声明它:

Signals that a method has been invoked at an illegal or inappropriate time. In other words, the Java environment or Java application is not in an appropriate state for the requested operation.

Effective Java 说(第 60 条,第 248 页):

Another commonly reused exception is IllegalStateException. This is generally the exception to throw if the invocation is illegal because of the state of the receiving object. For example, this would be the exception to throw if the caller attempted to use some object before it had been properly initialized.

这里似乎有些出入。 javadocs的第二句话听起来像是异常可以描述有关Java执行状态的非常广泛的条件,但Effective Java中的描述使它听起来像是用于专门与对象状态相关的条件方法已被调用。

我在 JDK(例如集合,Matcher)和 Guava 中看到的用法似乎肯定属于 Effective Java 所谈论的类别(“这个对象处于方法不能被调用”)。这似乎也与 IllegalStateException 的兄弟 IllegalArgumentException 一致。

JDK 中是否存在与“Java 环境”或“Java 应用程序”相关的合法 IllegalStateException 用法?或者是否有任何最佳实践指南提倡将其用于更广泛的执行状态?如果不是,那为什么 javadocs 会这样写呢? ;)

最佳答案

这是 JDK 中此异常的一种特别合法的用法(请参阅:URLConnection.setIfModifiedSince(long) 以及它的 300 多种其他用法:

public void setIfModifiedSince(long ifmodifiedsince) {
    if (connected)
        throw new IllegalStateException("Already connected");
    ifModifiedSince = ifmodifiedsince;
}

我认为这个例子很清楚。如果对象处于特定状态(“已连接”),则不应调用某些操作。在这种情况下,建立连接时,某些属性无法设置。

当您的类的某些状态(状态机?)会随着时间而改变,从而使某些方法变得不相关或不可能时,此异常特别有用。考虑一个具有 start()stop()fuel() 方法的 Car 类。虽然调用 start() 两次,一次又一次,可能没有错,但给启动的汽车加油肯定是个坏主意。即 - 汽车处于错误状态。

可以说好的 API 不应该允许我们调用处于错误状态的方法,以便在编译时而不是在运行时发现类似的问题。在此特定示例中,连接到 URL 应返回带有方法子集的不同对象,所有方法在连接后均有效。

关于java - IllegalStateException 的预期用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698275/

相关文章:

java - 为什么这个 insertionSort 代码没有给出正确的输出?

java - 如何在 Java 中正确处理定时器?

java - 如何捕获算术异常

java - 动态添加多个 TextViews 到 LinearLayout

android - MediaPlayer 的 IllegalStateException

java - 放入 Map 时出现非法状态异常

java - 无法导出可运行的 jar,启动配置呈灰色

java - 如何使用 android 从 Nest API 检索 Json 对象

c# - 在 C# 中为抛出的异常自动生成 XML 文档

java - 如何摆脱线程中的异常 "main"java.lang.NoClassDefFoundError : com/codexus/resources/ResourcesManager?