java.lang.NoSuchMethodException异常解决

本文讲述了作者在2023年遇到的Java运行时错误,错误源自同包同名类的方法不一致。通过反思和排查,作者发现类加载机制导致的意外类冲突是罪魁祸首,并强调了检查类冲突的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,这个错误必然是运行期间的,网上说了一堆,检查类有没有这个方法,我觉得都是废话,没有这个方法,能通过编译?
2023年自我纠正一下,反射的时候,方法不存在也会报错!还有什么场景,欢迎大佬们来指出!
下面我分享一个我项目运行报错java.lang.NoSuchMethodException情景

第一,我保证自己项目绝对有这个类和这个方法。且有一个?
第二,其他什么形参也都正确,从服务器拿包下来,反编译class文件也都没问题。阿,这。。。。。

反复打包反复发布到生产都不行,但是奇葩的是,测试环境并没有报错。

于是玄学了一天,本来完全肯定是有同包同名的另一个class类存在,而这个类没有我要得方法。折腾了大半天,失去了信心。

有一个前提:我们本地jar包启动springboot都没有这个错误。都是打包到外部容器,war包运行就会出现这个错误。

终于:idea全局搜索了意外看到了All Places,发现maven引的一个jar包也存在同包同名的另一个class,啃爹啊。没有选All Places,只能找到项目工程下的,并不能找到jar包里面的内容。
在这里插入图片描述
找到这个同包同名的class文件之后,删除也好,maven排除依赖也好,都可以,按实际情况来定。

总结:存在同包同名的class文件,方法不一致,由于jvm的类加载机制,可能会加载另一个不是我们想要的class。所以在运行的时候报错java.lang.NoSuchMethodException.
最后:
请仔细检查类冲突!!!
请仔细检查类冲突!!!
请仔细检查类冲突!!!

真相大白2023年
编辑器会优先加载我们自己写的class,这块可以配置。而打成jar包发布到tomcat容器,会按照jar包文件名排序优先加载lib下的jar。所以可能本地好好的什么事也没发生,是我们预期的想要的类,到了测试或者生产环境,就加载的另一个同胞同名的class文件了。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值