switch case中使用枚举类的坑

查看项目运行日志,发现项目中有报错:

Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: com/xxx/xxxController$1

首先看到这个ERROR,可以肯定是某个类找不到.是不是和ClassNotFoundException有点相像呢!!!
我也是问了度娘才知道:

NoClassDefFoundError和ClassNotFoundException区别:
1. Error一般可以理解为指系统异常或者jvm异常;
2. Exception是指逻辑上可以避免的异常或者是指逻辑上不能避免但是jvm可以检测到的异常
3. .NoClassDefFoundError既然是一个错误,是指jvm加载类时候,某一个类没有找到导致的错误。一般是ClassLoader尝试加载类(例如引用或者new对象时),找不到这个类的定义,此时会暴露这个错误。当部署项目时候,jar包或者定义的类丢失会导致这样的问题出现
4. ClassNotFoundException是一个异常。应该是编译不会发现问题,但是在项目运行时候或者调用方法应用时候,发生了异常。

所以这个错误应该是在部署时某个jar或者class被遗漏,所以开始了排查,发现在编译为class文件时多生成了匿名内部类的class文件,此时心里唱起了 ‘小朋友有没有很多问号???’ 是的一脸懵逼!!!
在这里插入图片描述
最后打开匿名内部类的class文件发现,是定义的某个枚举类,继续排查,在代码中找到了:
在这里插入图片描述
后来查阅资料:
内部类是用来存储枚举的映射表的,它记录了枚举和跳转符号的关系。实际上 case 的还是对应的数值,调用时会经过一次枚举对象到索引的转换.所以会生成一个$X.class文件,改类也不会被实例化.所以出现了上面的问题

虽然看的一脸懵逼,但是总算知道问题出在哪里了!
解决方法:
1.手动将$1.class文件进行部署
2.将case枚举换为常量

对这个问题理解的还不是太透彻,后期再补上,留个笔记,避免再次入坑!!!
查阅的博客:
https://www.v2ex.com/t/659605
https://my.oschina.net/fforever14/blog/1631143/print
https://stackoverflow.com/questions/1834632/java-enum-and-additional-class-files
http://www.voidcn.com/article/p-mszcylnp-bus.html
https://www.cnblogs.com/eahau/p/11003142.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值