IllegalStateException属于Java运行时异常体系,继承自RuntimeException,不需要在方法声明中显式抛出,通常在对象状态不符合方法调用要求时触发。下面我们结合具体场景和代码来详细了解它的使用逻辑。

常见使用场景一:迭代器遍历时修改集合
当使用迭代器遍历集合时,如果直接通过集合对象修改集合结构(比如添加、删除元素),而没有通过迭代器自身的方法操作,就会抛出IllegalStateException,更准确说是ConcurrentModificationException,它继承自IllegalStateException。下面是对应的代码示例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if ("b".equals(item)) {
// 直接通过集合删除元素,会触发异常
list.remove(item);
}
}
}
}正确的做法是通过迭代器的remove方法删除元素,避免触发状态异常。
常见使用场景二:重复调用终止方法
很多带有生命周期的对象,终止方法只能调用一次,重复调用就会抛出IllegalStateException。比如线程池的shutdown方法,或者某些资源的close方法,重复调用会导致状态异常。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
// 第一次关闭线程池,正常执行
executorService.shutdown();
// 重复关闭,会抛出IllegalStateException
executorService.shutdown();
}
}常见使用场景三:线程状态不匹配
当线程处于不合适的状态时,调用对应方法也会抛出IllegalStateException。比如已经启动的线程,再次调用start方法就会触发异常。
public class ThreadDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("线程执行中");
});
// 第一次启动线程
thread.start();
try {
// 等待线程执行完成
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 线程已经结束,再次启动会抛出IllegalStateException
thread.start();
}
}如何避免IllegalStateException
要避免这个异常,核心是在方法调用前校验对象状态:
- 使用迭代器遍历集合时,修改集合结构必须通过迭代器自身的方法
- 调用终止类方法前,先校验对象是否已经处于终止状态
- 操作线程、资源等有生命周期的对象时,先判断当前状态是否符合方法调用要求
- 自定义类时,如果方法依赖特定状态,在方法开头添加状态校验,不符合时主动抛出IllegalStateException并给出明确提示
以下是自定义类主动抛出IllegalStateException的示例:
public class Order {
private String status; // 订单状态:CREATED, PAID, SHIPPED, FINISHED
public void pay() {
// 只有CREATED状态的订单才能支付
if (!"CREATED".equals(status)) {
throw new IllegalStateException("当前订单状态为" + status + ",无法执行支付操作");
}
status = "PAID";
System.out.println("订单支付成功");
}
public void setStatus(String status) {
this.status = status;
}
public static void main(String[] args) {
Order order = new Order();
order.setStatus("SHIPPED");
// 已发货的订单调用支付,会抛出IllegalStateException
order.pay();
}
}通过合理的状态校验,可以让IllegalStateException的触发逻辑更清晰,也方便问题排查,提升代码的可维护性。
IllegalStateExceptionJava异常运行时异常状态校验修改时间:2026-05-25 22:02:54