java.lang.NoSuchMethodError异常可能出现的原因

感谢博主提供的思路:http://blog.csdn.net/dailywater/article/details/72848770。

最近web项目新增了部分功能,修改了其中一个工具类的方法,本地测试成功后,信心满满的编译class文件后上线,重启tomcat。

本着线上测试走一遍程序的原则,登录,执行相应的操作,哎...哎...哎...,怎么会报错,怎么会,这不科学啊!!!然后我又赶忙替换原来备份的文件让系统先运行着,本着侥幸的心态,可能是线下工具类没有成功编译吧...。重新编译,然后先将class文件反编译下,看下内容,恩恩,这下没问题了,是最新的代码,上线重启,测试。啊啊啊......,还是报错。

开始逐步排查问题,首先排除代码中方法不存在问题,因为上面已经测试了;然后尝试清一下线上tomcat的缓存,清空tomacat的work文件夹和temp文件夹下的内容,确保不是因为缓存问题,发现问题依旧存在。有点小蒙了,上网百度该异常情况,有可能是因为线上java环境与本地测试环境不一致问题,开始排查,jdk版本和tomcat等相关环境一致,本条思路断了。将线上class文件拿回本地反编译后,与本地代码比对,发现方法名称一致,参数类型一致,唯一不同的是方法返回值类型发生了变动,因为需求变动,由void改为long,以前没遇到过这种问题,同样没这方面知识,一开始没去注意,后来只能反复百度帖子,终于在一位大佬的帖中看到了新大陆,然后按照他的思路尝试下,原来是因为方法签名不一致问题,至此问题解决。

回顾问题解决过程,做了下小小的总结,java.lang.NoSuchMethodError异常出现可能有以下几种情况:

1)首先看下异常代码位置,是否存在该方法;

2)若是线下可以,上线出现该问题,清一下服务器tomcat的缓存问题;

3)比对线上java环境,tomcat等于本地测试环境是否一致,若不一致,线下使用相同的环境编译在上线;

4)方法签名是否发生改变,若发生改变,则需要把所有应用到该方法的文件一起替换。

。。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页