应主动抛出illegalstateexception以表明对象当前状态与操作要求冲突,需在方法入口检查关键状态标志并给出明确异常消息,配合受控状态变更设计,严格区分于illegalargumentexception。

当对象处于不合法状态却执行了不允许的操作时,应主动抛出 IllegalStateException。它表明当前对象的状态与方法调用的要求冲突,不是参数问题(那是 IllegalArgumentException),而是“此刻不该这么干”。
明确判断状态条件再抛出
在方法开头检查关键状态标志,比如是否已初始化、是否已关闭、是否处于运行中等。一旦发现状态不满足执行前提,立即抛出异常。
- 避免在逻辑深处才检查,应在入口处快速失败
- 状态判断要清晰,例如
if (!initialized) throw new IllegalStateException("Not initialized"); - 不要用布尔变量名含糊其辞,如
ready不如isStarted或hasBeenConfigured
使用有意义的异常消息
消息要说明“当前状态是什么”和“期望状态是什么”,帮助调用方快速定位问题根源。
- 差:
"Operation not allowed" - 好:
"Cannot write after stream is closed" - 更好:
"Attempt to call write() on a closed OutputStream; current state: CLOSED"
配合不可变状态变更设计
确保状态变更本身是受控的,比如通过私有字段 + 同步块 + 状态转移校验,防止非法中间态出现。
- 定义有限状态(如 CREATED → STARTED → STOPPED → TERMINATED)
- 每个状态变更方法(如
start()、stop())内部先校验前序状态,再更新状态 - 对多线程场景,考虑用
volatile或AtomicInteger管理状态,或加锁保证原子性
避免与 IllegalArgumentException 混淆
区分“输入参数错”和“对象自身状态错”。前者是外部传入值不合法;后者是对象当前所处阶段不允许该操作。
- 传入
null或负数索引?→IllegalArgumentException - 调用
iterator().next()但迭代器已耗尽?→IllegalStateException - 对已 shutdown 的线程池提交任务?→
IllegalStateException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











