如何解决 Java 中的 IllegalStateException?

2025年5月9日 | 阅读 5 分钟

在 Java 中,异常是程序中未预料到的错误。大多数情况下,异常发生在代码错误时,但可以被处理。它会中断代码的正常执行流程。

例如,当用户输入了无效信息、代码无法读取远程文件、或者网络连接在通信过程中断开时,代码会抛出异常。

Java 中的 IllegalStateException

IllegalStateException 是 RuntimeException 类的子类,因此它是一个未检查异常。它由程序员或 API 开发者显式抛出。当一个方法调用不合法或在不正确的时间调用一个方法时,就会抛出此异常。

例如,一旦我们启动了一个线程,就不能再次启动同一个线程;如果我们尝试这样做,它会抛出一个运行时异常,即 IllegalStateException

异常可能会在我们使用 Collections 框架时出现。List、Queue、Map、Tree 是一些集合。其中,List 和 Queue 在特定条件下倾向于抛出 Illegal State 异常。

注意:IllegalStateException 异常并非仅限于 Collections 框架。

让我们看一些会抛出 IllegalStateException 的场景。

示例 1

以下 Java 程序描绘了当我们尝试在 run() 方法正在执行时调用 start() 方法的情况。

IllegalStateExceptionTest1.java

输出

How to resolve IllegalStateException in Java

示例 2

以下代码描绘了当 run() 方法执行完毕后,我们对一个线程调用 start() 方法的情况。

IllegalStateExceptionTest2.java

输出

How to resolve IllegalStateException in Java

示例 3

以下代码解释了在移动到第一个元素之前,我们使用 remove() 方法从 ArrayList 中删除元素的情况。

IllegalStateExceptionTest3.java

输出

How to resolve IllegalStateException in Java

IllegalStateException 的解决方案

为了避免 Java 中的 java.lang.IllegalStateException,我们应该注意确保我们代码中的任何方法都不能在不恰当或不合法的时间被调用。

示例 1 和 2 的解决方案

考虑上面示例 1 和 2,我们多次调用了 start() 方法。如果只调用一次,我们就不会遇到这个异常。因为在启动线程后就不会再调用 start() 方法了。

IllegalStateExceptionSolution.java

输出

How to resolve IllegalStateException in Java

示例 3 的解决方案

ArrayList 类的 remove() 方法用于在调用 next() 方法后删除最后一个元素。

  • 删除当前索引处的元素后,我们必须移动到下一个元素才能删除它。(对于每次调用 next() 方法,我们只能调用一次 remove() 方法)。
  • 由于列表的初始位置在第一个元素之前,我们不能在不调用 next() 方法的情况下调用 remove() 方法。

为了防止异常,我们需要在 Java 代码中遵循上述步骤。

IllegalStateExceptionSolution2.java

输出

How to resolve IllegalStateException in Java