
当状态机中当前状态与目标状态的流转不合法时,用 throw 主动抛出 InvalidStateTransitionException 是清晰表达业务约束的常用做法。关键在于:先校验合法性,不满足就立即 throw 自定义异常,不继续执行后续逻辑。
定义 InvalidStateTransitionException
这是一个运行时异常(继承 RuntimeException),无需强制捕获,语义明确:
public class InvalidStateTransitionException extends RuntimeException {
public InvalidStateTransitionException(String message) {
super(message);
}
public InvalidStateTransitionException(String from, String to) {
this("非法状态流转:从 [" + from + "] 到 [" + to + "]");
}
}
在状态流转方法中使用 throw 校验
在触发状态变更的方法(如 transitionTo())里,显式判断当前状态是否允许跳转到目标状态。不匹配就 throw:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 获取当前状态(如
currentState)和待转入状态(如targetState) - 查表或用 switch/if 判断该组合是否被允许(例如:只有
CREATED可以转PROCESSING,COMPLETED不可逆) - 不合法时直接
throw new InvalidStateTransitionException(currentState, targetState)
public void transitionTo(String targetState) {
if (!isValidTransition(currentState, targetState)) {
throw new InvalidStateTransitionException(currentState, targetState);
}
currentState = targetState;
}
配合状态流转规则做校验
校验逻辑可以封装为独立方法,提高可读性和复用性:
- 用 Map
> 定义每个状态能到达的合法目标状态集 - 或用枚举 + 方法(如
OrderStatus.canTransitionTo())封装状态间关系 - 确保
throw发生在状态实际变更之前,避免中间态污染
调用方如何处理
虽然它是 unchecked 异常,但建议在关键业务入口(如 API 方法)中捕获并转换为用户友好的响应:
- 用 try-catch 捕获
InvalidStateTransitionException - 返回 HTTP 400 或特定错误码,并附带提示信息(如 "当前状态不允许执行此操作")
- 日志记录原始异常,便于排查流转配置问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










