首页 / 知识
关于Java:如何修复NoSuchMethodError?
2023-04-13 16:02:00
How do I fix a NoSuchMethodError?
运行Java程序时出现 没有更多信息,很难找出问题所在,但根本原因是,您可能是针对缺少该方法的该类的另一版本编译了一个类,而不是运行该类时所使用的方法。 查看堆栈跟踪...如果在库中的对象上调用方法时出现异常,则很可能在编译和运行时使用库的不同版本。确保两个地方的版本都正确。 如果在对您所创建的类实例化的对象上调用方法时出现异常,则说明您的构建过程似乎有问题。确保在编译时实际运行的类文件已更新。 我遇到了您的问题,这就是我解决的方法。以下步骤是添加库的有效方法。我已经正确完成了前两个步骤,但是没有通过将" .jar"文件直接从文件系统拖到eclipse项目上的" lib"文件夹中来完成最后一个步骤。此外,我还必须从构建路径和" lib"文件夹中删除该库的先前版本。 第1步-添加.jar以构建路径
第2步-关联源和javadocs(可选)
步骤3-实际上将.jar文件拖到" lib"文件夹中(非可选)
请注意,在反射的情况下,您得到 如果您有权更改JVM参数,则添加详细的输出应使您能够查看从哪些JAR加载了哪些类。
运行程序时,JVM应该转储到标准输出信息,例如:
这通常是在使用Apache Ant之类的构建系统时引起的,该构建系统仅在Java文件比类文件新时才编译Java文件。如果方法签名发生更改,并且类使用的是旧版本,则可能无法正确编译。通常的解决方法是进行完全重建(通常是" ant clean"然后是" ant")。 有时,当针对库的一个版本进行编译但针对不同版本运行时,也可能导致这种情况。 如果使用Maven或其他框架,并且几乎随机出现此错误,请尝试像...这样的全新安装。
如果您编写了对象并且知道它具有方法,则这特别可能起作用。为我工作。
这也可能是使用反射的结果。如果您具有在类上反映并按名称提取方法的代码(例如,使用 如果是这个原因,那么堆栈跟踪应该显示反射方法被调用的点,您只需要更新参数以匹配实际的方法签名即可。
以我的经验,在对私有方法/字段进行单元测试并使用 如果要编写Web应用程序,请确保容器的全局库目录以及应用程序中的jar版本都不冲突。您可能不一定知道类加载器正在使用哪个jar。 例如
仅添加到现有答案中。我在Eclipse中遇到了tomcat的问题。我换了一堂课,并按照以下步骤做, 在eclpise中清理并建立了项目 mvn全新安装 我仍然面临着同样的错误。然后我清理了tomcat,清理了tomcat的工作目录并重启了服务器,我的问题消失了。希望这可以帮助某人 这意味着相应的方法不在类中:
我刚刚通过重新启动Eclipse并运行应用程序解决了该错误。 对我来说,发生这种情况是因为我将函数中的参数类型从Object a更改为String a。我可以解决它并重新构建
这些问题是由在相同的两个类上使用相同的对象引起的。 例如:
这些问题是由伴随的02类似类引起的(src中为1,jar文件中为1,此处是gateway.jar)。 尝试这种方式:删除项目目录(以及所有子目录)下的所有.class文件。重建。
有时
我通过重命名Junit测试文件在Eclipse中解决了此问题。
开始获取NoSuchMethodError。
将测试重命名为正确的名称" ProjectionTest.java"后,异常消失了。 回答原始问题。根据此处的Java文档:
通常,此错误由编译器捕获;如果类的定义发生了不兼容的更改,则只有在运行时才会发生此错误。
我在应用程序中更改方法签名时遇到了类似的问题。
上面的答案很好解释..只是添加一件事
在我的情况下,我有一个多模块项目,场景就像 相关:https://reflectoring.io/nosuchmethod/ 我遇到了类似的问题。
最后,我确定了根本原因是更改了变量的数据类型。
我们应该通过仅包含已修改的类来重新打包jar。由于
最佳解释:https://www.journaldev.com/14538/java-lang-nosuchmethoderror 我也遇到了这个错误。 我的问题是我更改了方法的签名,例如
进入
此方法是从类似于以下内容的上下文中调用的
编译器对警告/错误保持沉默,因为资本既是货币又是欧元。 出现问题的原因是我只编译了定义方法的类-Bank,而不编译了从其中调用方法的类,其中包含main()方法。 这个问题不是您经常遇到的问题,因为大多数情况下是手动重建项目或自动触发Build操作,而不仅仅是编译一个修改过的类。 我的用例是,我生成了一个.jar文件,该文件将用作修补程序,该文件不包含App.class,因为未经修改。对我来说,不包含它是有意义的,因为我保留了初始参数的基类通过继承。 问题是,当您编译类时,生成的字节码是静态的,换句话说,这是硬引用。 原始的反汇编字节码(使用javap工具生成)如下所示:
在ClassLoader加载新的编译后的Bank.class之后,它将找不到这种方法,看起来好像它已被删除并没有更改,因此命名错误。 希望这可以帮助。 就我而言,问题是在构建路径中有相同库的两个版本。该库的旧版本没有该功能,而新版本则具有。
我在使用Intelij的Gradle项目中遇到了类似的问题。 NoSuchMethodError:我花了几个小时解决了这个问题,最后通过重命名包名称,清理并构建来解决了它。如果不起作用,请先尝试清理构建,然后重命名类名或包名并清理构建。 。它应该是固定的。祝好运。 我有同样的错误:
为了解决这个问题,我首先检查了模块依赖图(
1)因此,我直接在项目的POM中明确添加了最高版本-这两个版本均为2.8.7。 在属性中:
并作为依赖项:
2)但也可以使用依赖排除来解决。 通过以下示例中的相同原理:
与有害版本的依赖关系将从您的项目中排除。 我遇到了同样的问题。当班级中存在歧义时,也会造成这种情况。我的程序试图调用存在于相同位置/类路径中的两个JAR文件中的方法。删除一个JAR文件或执行您的代码,以便仅使用一个JAR文件。检查您使用的不是同一JAR或包含相同类的同一JAR的不同版本。
如果您的文件名与包含m??ain方法的类名不同,则可能是由该错误引起的。 |
最新内容
相关内容
linux做路由跟踪命令?
linux做路由跟踪命令?,网络,系统,地址,设备,信息,电脑,工作,命令,服务,全球,linux查找网络配置命令是什么?1、首先在电脑上打开Linux系统,然后linux命令创建项目组?
linux命令创建项目组?,管理,密码,项目,命令,系统,位置,文件,用户组,用户,文件夹,linux命令中用root用户新建一个user1用户,新建一个group1的组linux开启运行命令?
linux开启运行命令?,系统,服务,工作,管理,状态,命令,标准,情况,环境,工具,linux中如何开机启动运行指定的应用程序或指令?1、开机启动时自动运linux运行wps命令?
linux运行wps命令?,软件,官网,名称,时间,电脑,系统,工具,环境,项目,数据,wps支持linux命令行下word转pdf吗?1、通过浏览器进入到wps官网,然后点linux开启命令跟踪?
linux开启命令跟踪?,系统,信息,软件,对比,工具,发行,通信,实时,状态,最新,如何在Linux用户和内核空间中进行动态跟踪1、如果在一开始就需要查复制项目的linux命令?
复制项目的linux命令?,系统,项目,文件,命令,目录,源文件,语法,选项,目标,功能,在Linux操作系统中复制文件或目录时使用的命令是()。1、在Linuxlinux运行两个命令?
linux运行两个命令?,网络,地址,系统,工作,暂停,命令,网站,密码,网上,入口,Linux下必须知道的11个网络命令1、netstat -r:打印路由表。路由表保linux命令运行代码?
linux命令运行代码?,代码,单位,系统,环境,连续,保险,工具,命令,文件,音乐,Linux中,运行一个C语言程序如何运行1、编译。由.c文件生成.o文件,写linux跟踪路由器命令?
linux跟踪路由器命令?,网络,地址,系统,信息,情况,工具,时间,通信,命令,管理人员,在路由器和Linux系统中,用来跟踪网络路径的命令是什么?命令格linux命令项目部署?
linux命令项目部署?,项目,服务,环境,软件,系统,代理,管理,统一,做好,业务,怎么把php部署到apache服务器上linux?1、在linux部署php项目的方法:linux命令忽略错误?
linux命令忽略错误?,系统,地址,工作,信息,设备,命令,设计,灵活,观察,标准,linux命令问题,在使用ls命令时,能不能不让输出错误信息--pid=进程号linux命令运行脚本?
linux命令运行脚本?,代码,系统,工作,设计,状态,命令,脚本,文件,目录,终端,运行linux脚本,遇到要按回车键,怎么让它自动应答,继续运行脚本?1、