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

什么是打算使用的IllegalStateExcture?

鲜于凯歌
2023-03-14

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

Javadocs for Java的IllegalStateExc0019声明它:

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

有效Java表示(第248页第60项):

另一个经常重用的异常是IllegalStateExcema。如果由于接收对象的状态,调用是非法的,这通常是抛出的异常。例如,如果调用方试图在正确初始化某个对象之前使用该对象,则会引发异常。

这里似乎有点不一致。javadocs的第二句话听起来像是异常可以描述关于Java执行状态的一个非常广泛的条件,但是在有效Java中的描述听起来像是用于专门与方法被调用的对象的状态相关的条件。

我在JDK(例如,collections,Matcher)和Guava中看到的用法显然属于有效Java所谈论的类别(“此对象处于无法调用此方法的状态”)。这似乎也与IllegalStateException的同级IllegalArgumentException一致。

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

共有3个答案

谷梁昊空
2023-03-14

我想如果你看到IllegalStateException的用法,如果更合适的话,我会说第二个。此异常在许多包中使用

  • 爪哇。net

指定一个示例ArrayBlockingQueue。如果队列已满,add将引发此异常。现在,full是对象的状态,它在不适当或非法的时间被调用

我想两者意思相同,但措辞不同。

贲永思
2023-03-14

下面是JDK中的一个例子。有一个包私有类称为java.lang.关闭。如果系统正在关闭,并且您试图添加一个新的钩子,它会抛出IllegalStateExcure。有人可能会说,这符合“javadoc”指南的标准——因为Java环境处于错误的状态。

class Shutdown {    
...

   /* Add a new shutdown hook.  Checks the shutdown state and the hook itself,
    * but does not do any security checks.
    */
    static void add(int slot, Runnable hook) {
        synchronized (lock) {
            if (state > RUNNING)
                throw new IllegalStateException("Shutdown in progress");

            if (hooks[slot] != null)
                throw new InternalError("Shutdown hook at slot " + slot + " already registered");

            hooks[slot] = hook;
        }
    }

然而,它也说明了“javadoc”指南和“有效Java”指南之间实际上没有区别。由于实现关闭的方式,JVM的关闭状态存储在一个名为state的字段中。因此,它还满足何时使用IllegalStateExcema的有效Java指南,因为“状态”字段是接收对象状态的一部分。由于接收对象(Shutdown)处于错误的状态,它会抛出IllegalStateExcture。

在我看来,关于何时使用IllegalStateExcema的两种描述是一致的。有效Java描述更实用一点,仅此而已。对我们大多数人来说,整个Java环境中最重要的部分是我们现在正在写的类,所以这就是作者所关注的。

呼延靖
2023-03-14

以下是此异常在JDK中的一个特别合法的用法(参见:URLConnection.setIfModifiedSince(long),以及它的300种其他用法:

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

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

当类具有某种状态(状态机?)时,此异常特别有用这会随着时间的推移而改变,使得某些方法变得无关紧要或不可能。考虑一个Car类,它有start()stop()fuel()方法。调用start()两次,一次又一次,可能没什么错,但给启动的汽车加油肯定是个坏主意。也就是说,汽车处于错误的状态。

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

 类似资料:
  • 问题内容: 运算符是做什么用的?我看过类似的东西 但是,这对我来说都没有意义。我已经完成了研究,但只提出了没有任何解释的示例。 问题答案: 是用于测试对象(实例)是否为给定Type的子类型的二进制运算符。 想像: 然而,随着;, 因为是的超类型,可能较少。 和, 这是因为Dog既不是的子类型也不是的父类型Cat,并且它也不实现它。 请注意,上面用于的变量是类型。这是一个运行时操作,将我们带到一个用

  • 问题内容: 我最近遇到了以下代码: 这是什么,某种反向双λ? 问题答案: 没有操作员。第一个只是Java 8中引入的lambda语法,第二个是误导性的“小于” 和“一元减”的串联。 您可以将其读取为,即它会测试是否小于,所有(很好,大多数)负数就是这种情况,因此命名为。 仅出于完整性考虑:此测试不仅(有意地?)难以理解,而且-如评论中所指出- 也因(而)失败。相反,您可能应该只使用简单得多的。

  • 主要内容:算法是什么,伪代码描述算法要想成为一名合格的程序员,除了至少掌握一门编程语言,更重要的是多动手实践,积累足够的代码量,提升自己“遇到问题,解决问题”的能力。任何一门编程语言的学习,本质就是学习它规定的语法,整个过程只能死记硬背,几乎没有捷径。但是,提高“解决问题”的能力是有捷径可寻的,比如掌握一些算法。 提到“算法”,很多人都觉得它高深莫测、晦涩难懂。事实上的确存在一些算法,学员必须具备优秀的数学基础和编程能力才能驾驭。但

  • 问题内容: 我正在阅读一个python脚本,该脚本接受XML文件的输入并输出XML文件。但是,我不了解打印语法。可有人请解释什么的呢? 问题答案: 该方法格式化字符串字面量 和它的新功能。 甲 格式的字符串文字 或 F-串 是前缀字符串文字或。这些字符串可能包含替换字段,这些替换字段由花括号分隔。尽管其他字符串文字始终具有恒定值,但是格式化的字符串实际上是在运行时评估的表达式。 格式化字符串文字的

  • 问题内容: 香港专业教育学院一直想知道这一点,但从来没有机会对其进行研究。 SQL中使用哪种算法?自然地,您搜索并比较基本语句,什么搜索算法?排序?以及其他功能(例如Join的功能等)。 我知道对这些问题没有明确的答案,但其想法是收集有关SQL使用哪种方法执行其工作的一般想法。 问题答案: 我建议您得到Delaney,Randal,Tripp等的副本。

  • 问题内容: 我试图向某人解释为什么他们应该使用Python的内置sorted()函数而不是滚动自己的函数,但我意识到我不知道它使用什么算法。 如果重要的话,我们说的是python 2.7 问题答案: Python使用一种称为Timsort的算法: Timsort是一种混合排序算法,是从合并排序和插入排序派生而来的,旨在对多种现实数据表现良好。它是由Tim Peters在2002年发明的,用于Pyt