开发者社区 问答 正文

java_lang_NoSuchMethodException由什么引起的?


问题分析:
找不到特定的函数时抛出此类异常,因为编译时依赖的库版本有这个函数的,但是运行时却没有找到,这个异常通常发生在反射调用时被抛出。
解决方案:
找不到特定的函数时抛出此类异常,请注意打包的类库版本信息,一般发生在反射调用时被抛出。请查看日志中此crash附近日志信息,并检查日志报错对应的代码是否写错函数名。
代码示例:

  1. [backcolor=transparent]    [backcolor=transparent]package[backcolor=transparent] com[backcolor=transparent].[backcolor=transparent]alibaba[backcolor=transparent].[backcolor=transparent]mqc[backcolor=transparent].[backcolor=transparent]test[backcolor=transparent];
  2. [backcolor=transparent]    [backcolor=transparent]import[backcolor=transparent] java[backcolor=transparent].[backcolor=transparent]lang[backcolor=transparent].[backcolor=transparent]reflect[backcolor=transparent].[backcolor=transparent]InvocationTargetException[backcolor=transparent];
  3. [backcolor=transparent]    [backcolor=transparent]import[backcolor=transparent] java[backcolor=transparent].[backcolor=transparent]lang[backcolor=transparent].[backcolor=transparent]reflect[backcolor=transparent].[backcolor=transparent]Method[backcolor=transparent];
  4. [backcolor=transparent]    [backcolor=transparent]//简单的反射demo
  5. [backcolor=transparent]    [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]class[backcolor=transparent] V [backcolor=transparent]{
  6. [backcolor=transparent]        [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] printf[backcolor=transparent](){
  7. [backcolor=transparent]            [backcolor=transparent]System[backcolor=transparent].[backcolor=transparent]out[backcolor=transparent].[backcolor=transparent]println[backcolor=transparent]([backcolor=transparent]"printf"[backcolor=transparent]);
  8. [backcolor=transparent]        [backcolor=transparent]}
  9. [backcolor=transparent]        [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]static[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] main[backcolor=transparent]([backcolor=transparent]String[backcolor=transparent][][backcolor=transparent] args[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]throws[backcolor=transparent] [backcolor=transparent]ClassNotFoundException[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]SecurityException[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]NoSuchMethodException[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]IllegalArgumentException[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]IllegalAccessException[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]InvocationTargetException[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]InstantiationException[backcolor=transparent] [backcolor=transparent]{
  10. [backcolor=transparent]            [backcolor=transparent]Class[backcolor=transparent] c [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]Class[backcolor=transparent].[backcolor=transparent]forName[backcolor=transparent]([backcolor=transparent]"com.alibaba.mqc.test.V"[backcolor=transparent]);
  11. [backcolor=transparent]            [backcolor=transparent]Method[backcolor=transparent] m [backcolor=transparent]=[backcolor=transparent] c[backcolor=transparent].[backcolor=transparent]getDeclaredMethod[backcolor=transparent]([backcolor=transparent]"printf"[backcolor=transparent],[backcolor=transparent]null[backcolor=transparent]);
  12. [backcolor=transparent]            m[backcolor=transparent].[backcolor=transparent]invoke[backcolor=transparent]([backcolor=transparent]c[backcolor=transparent].[backcolor=transparent]newInstance[backcolor=transparent](),[backcolor=transparent]null[backcolor=transparent]);
  13. [backcolor=transparent]        [backcolor=transparent]}
  14. [backcolor=transparent]    [backcolor=transparent]}

参考文献:
1.https://docs.oracle.com/javase/7/docs/api/java/lang/NoSuchMethodException.html
2.http://stackoverflow.com/questions/19913970/java-java-lang-nosuchmethodexception

展开
收起
猫饭先生 2017-10-25 10:40:40 1618 分享 版权
阿里云 AI 助理回答

您提到的问题是关于Java中NoSuchMethodException异常的处理,这通常发生在使用反射API尝试调用一个不存在的方法时。您的解决方案概述和代码示例已经很好地展示了如何处理这种情况,包括检查类库版本、分析日志信息以及正确使用反射调用方法。

在阿里云产品环境下,虽然直接关联不大,但可以考虑以下几点建议来优化或避免此类问题:

  1. Maven或Gradle依赖管理:确保项目中使用的依赖库版本一致,避免编译与运行环境不匹配。使用Maven或Gradle等构建工具可以帮助管理依赖,确保所有开发环境和生产环境使用相同版本的库。

  2. 阿里云函数计算(Function Compute): 如果您在部署Java应用到阿里云函数计算上遇到此问题,确保本地开发环境和函数计算服务端的Java运行时环境版本一致,同时上传所有必要的依赖包,避免因环境差异导致的类找不到问题。

  3. 日志服务(SLS): 利用阿里云的日志服务收集应用程序日志,当发生NoSuchMethodException时,详细日志可以帮助快速定位问题所在,包括具体哪个类、哪个方法无法找到。

  4. EDAS(Enterprise Distributed Application Service): 如果您的应用部署在阿里云EDAS上,利用其应用诊断功能,可以更容易地监控和调试应用,及时发现并解决方法找不到等问题。

  5. 云效(Cloud Toolkit): 使用阿里云的云效插件进行高效开发和部署,它可以帮助开发者更便捷地同步本地开发环境与云端部署环境的配置,减少因环境差异导致的错误。

总之,无论是从技术实践还是利用阿里云提供的服务,关键在于确保开发、测试和生产环境的一致性,以及充分利用云平台的监控和诊断能力,以便于快速定位和解决问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: