查看项目运行日志,发现项目中有报错:
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