导读:本期聚焦于小伙伴创作的《Java中IllegalStateException有哪些使用场景?附代码示例》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java中IllegalStateException有哪些使用场景?附代码示例》有用,将其分享出去将是对创作者最好的鼓励。

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

Java中IllegalStateException有哪些使用场景?附代码示例

常见使用场景一:迭代器遍历时修改集合

当使用迭代器遍历集合时,如果直接通过集合对象修改集合结构(比如添加、删除元素),而没有通过迭代器自身的方法操作,就会抛出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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。