0

0

详解EnumConstantNotPresentException_运行时缺失枚举常量的特殊场景

P粉602998670

P粉602998670

发布时间:2026-02-25 15:25:02

|

408人浏览过

|

来源于php中文网

原创

enumconstantnotpresentexception 是运行时异常,发生在访问当前类加载器中不存在的枚举常量时,常见于序列化/反序列化、@value 配置绑定、多版本 jar 冲突等场景。

详解enumconstantnotpresentexception_运行时缺失枚举常量的特殊场景

EnumConstantNotPresentException 是什么异常

这是 Java 运行时抛出的 RuntimeException,发生在代码试图访问一个**当前类加载器中不存在的枚举常量**时。它不是编译期报错,也不代表你写错了枚举名——而是「类定义变了,但某些地方还按旧版本在用」。

典型触发点:序列化/反序列化、反射读取注解、RMI、Spring AOP 代理、JPA/Hibernate 映射字段,甚至只是 jar 包混用。

常见错误现象:

  • java.lang.EnumConstantNotPresentException: MyEnum.UNKNOWN
  • 应用启动成功,但调用某个接口时突然炸出这个异常
  • 本地跑得好好的,上线后出问题;或测试环境 OK,预发环境报错

为什么反序列化最容易踩这个坑

Java 原生序列化(ObjectInputStream)在反序列化枚举时,不校验枚举类是否包含该常量,而是直接用字符串名称去 Enum.valueOf()。如果反序列化的字节流来自老版本(比如含 OLD_VALUE),而当前类已删掉它,就会抛 EnumConstantNotPresentException

实操建议:

  • 永远不要对枚举做 Java 原生序列化——改用 JSON(如 Jackson)或 Protobuf,它们能显式控制字段存在性
  • 若必须用 ObjectInputStream,在反序列化前加一层包装:捕获 EnumConstantNotPresentException,转为默认值或空对象
  • 检查所有 serialVersionUID:枚举类加了 serialVersionUID 也没用,因为 JDK 对枚举序列化有特殊逻辑(忽略该字段)

@Value 注解读取配置时触发该异常

Spring 的 @Value("${my.enum}") 如果绑定到一个枚举类型,且配置值是当前枚举里没有的常量(比如配置写成 my.enum=DEPRECATED,但代码里已删掉 DEPRECATED),Spring 会在类型转换阶段调用 Enum.valueOf(),直接抛出该异常。

Gatekeep
Gatekeep

Gatekeep AI是一个专注于将文本转化为教学视频的智能教学工具,主要用于数学和物理等学科的教育。

下载

使用场景:

  • 配置中心动态下发枚举值(如开关、策略名)
  • yml 中写死枚举名,但后续重构删了枚举项

实操建议:

  • 改用 @ConfigurationProperties + 自定义 Converter<string myenum></string>,在 convert 方法里兜底返回默认值
  • 避免直接 @Value 绑定枚举,改为绑定 String,再手动 MyEnum.fromName()(自己实现容错逻辑)
  • CI 阶段加检查:扫描所有 yml/properties 文件,比对其中出现的枚举字面量是否仍在源码中存在

升级依赖或模块后突然出现该异常

这不是你的代码错了,而是「类路径污染」:多个 jar 包提供了同名枚举类,但内容不同。例如 A 模块打的 jar 里 StatusPENDINGDONE,B 模块依赖旧版 A,它的 jar 里 Status 还多一个 INIT。当 B 模块反序列化数据(含 INIT)传给 A 模块处理时,A 就会炸。

性能 / 兼容性影响:

  • 异常堆栈可能很深,定位困难(尤其涉及 Spring Bean 初始化或 AOP 代理)
  • 同一个枚举类被不同 ClassLoader 加载两次,会导致 == 判断失效、switch 报错

实操建议:

  • jps -l + jstack 或 Arthas 查看异常发生时加载该枚举的 ClassLoader 是哪个
  • Maven 里执行 mvn dependency:tree -Dverbose | grep MyEnum,确认有没有多版本冲突
  • 在关键入口加日志:log.debug("Loaded {} from {}", MyEnum.class, MyEnum.class.getClassLoader())

最麻烦的地方在于:它不报编译错误,不进单元测试,甚至不进集成测试——只在特定数据、特定部署顺序、特定 ClassLoader 层级下才触发。排查时别盯着自己代码改,先盯住「谁在传这个枚举值」「这个值从哪来」「那个类到底被谁加载了」。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

144

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

81

2026.01.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

448

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

323

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

152

2024.02.23

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

90

2025.08.06

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号