gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:54:02 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com