如何修复nosuchmethoderror?

xmjla07d  于 2021-07-12  发布在  Java
关注(0)|答案(24)|浏览(320)

我得到一个 NoSuchMethodError 运行java程序时出错。有什么问题,我该怎么解决?

bvjveswy

bvjveswy1#

如果没有更多的信息,很难找出问题所在,但根本原因是您很可能是针对缺少方法的类的不同版本编译了一个类,而不是针对运行该类时使用的版本。
看看堆栈跟踪。。。如果在对库中的对象调用方法时出现异常,则在编译和运行时很可能使用不同版本的库。确保两个地方都有正确的版本。
如果在调用由您创建的类示例化的对象的方法时出现异常,那么您的构建过程似乎是错误的。确保编译时更新了实际运行的类文件。

t98cgbkg

t98cgbkg2#

我有你的问题,我就是这样解决的。以下步骤是添加库的有效方法。我已经正确地完成了前两个步骤,但是我没有通过将“.jar”文件直接从文件系统拖到eclipse项目的“lib”文件夹来完成最后一个步骤。此外,我还必须从构建路径和“lib”文件夹中删除库的早期版本。

步骤1-将.jar添加到构建路径

步骤2-关联源代码和javadocs(可选)

第3步-实际将.jar文件拖到“lib”文件夹中(不是可选的)

r9f1avp5

r9f1avp53#

注意,在反射的情况下,你会得到一个 NoSuchMethodException ,而使用非反射代码 NoSuchMethodError . 当我面对一个和另一个的时候,我倾向于去不同的地方寻找。

72qzrwbm

72qzrwbm4#

如果您有权更改jvm参数,那么添加详细输出将允许您查看从哪个jar文件加载了哪些类。

java -verbose:class <other args>

程序运行时,jvm应转储到标准输出信息,例如:
...
[从文件:/c:/program%20files/junit3.8.2/junit.jar加载了junit.framework.assert]
...

af7jpaap

af7jpaap5#

这通常是在使用apacheant这样的构建系统时造成的,该系统只在java文件比类文件更新时编译java文件。如果一个方法签名发生了变化,并且类使用的是旧版本,则可能无法正确编译。通常的修复方法是进行完全重建(通常是“ant clean”,然后是“ant”)。
有时,在对库的一个版本进行编译但在另一个版本上运行时,也会导致这种情况。

gywdnpxw

gywdnpxw6#

如果您使用maven或其他框架,并且几乎是随机地出现此错误,请尝试一个干净的安装,如。。。

clean install

如果您编写了对象,并且知道它有方法,那么这种方法尤其可能有效。为我工作。

uqdfh47h

uqdfh47h7#

这也可能是使用反射的结果。如果您有反映在类上并按名称提取方法的代码(例如:with Class.getDeclaredMethod("someMethodName", .....) )然后,每当方法名发生更改时(例如在重构期间),您都需要记住更新反射方法的参数以匹配新方法签名或 getDeclaredMethod 呼叫将抛出 NoSuchMethodException .
如果这是原因,那么堆栈跟踪应该显示调用反射方法的点,并且您只需要更新参数以匹配实际的方法签名。
根据我的经验,在单元测试私有方法/字段和使用 TestUtilities 类来提取用于测试验证的字段(通常使用的是没有考虑到单元测试的遗留代码。)

qyzbxkaa

qyzbxkaa8#

如果您正在编写webapp,请确保容器的全局库目录和应用程序中没有jar的冲突版本。您可能不一定知道类加载器正在使用哪个jar。
例如
tomcat/common/lib
mywebapp/web-inf/lib

rkkpypqq

rkkpypqq9#

对我来说,这是因为我将函数中的参数类型从object a改为string a。我可以解决它与清洁和建设再次

pkmbmrz7

pkmbmrz710#

这些问题是由于在相同的两个类中使用相同的对象造成的。使用的对象不包含新对象类包含的新方法。
前任:

filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) ) 
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
        at gateway.smpp.USSDClient.bind(USSDClient.java:139)
        at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
        at gateway.USSDGW.<init>(USSDGW.java:184)
        at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)

-bash-3.00$

这些问题是由伴随的02相似类引起的(src中1个,jar文件中1个是gateway.jar)

esyap4oy

esyap4oy11#

这意味着类中不存在相应的方法:
如果您使用的是jar,那么反编译并检查jar的各个版本是否有正确的类。
检查是否从源代码编译了正确的类。

ybzsozfc

ybzsozfc12#

我刚刚通过重新启动eclipse并运行应用程序解决了这个错误。我这样做的原因可能是因为我在不关闭项目或eclipse的情况下替换了源文件。这导致了我使用的类的不同版本。

hjqgdpho

hjqgdpho13#

尝试以下方法:删除项目目录下的所有.class文件(当然还有所有子目录)。重建。
有时 mvn clean (如果您使用的是maven)不清除由手动创建的.class文件 javac . 那些旧文件包含旧签名,导致 NoSuchMethodError .

pzfprimi

pzfprimi14#

在我的情况下,我有一个多模块的项目和场景是这样的 com.xyz.TestClass 在模块中 A 以及在模块中 B 和模块 A 依赖于模块 B . 因此,在创建程序集jar时,我认为只保留了类的一个版本,如果没有调用的方法,那么 NoSuchMethodError 运行时异常,但编译正常。
相关:https://reflectoring.io/nosuchmethod/

lo8azlld

lo8azlld15#

回答最初的问题。根据java文档:
如果应用程序试图调用类(静态或示例)的指定方法,而该类不再具有该方法的定义,则抛出“nosuchmethoderror”。
通常,这个错误被编译器捕获;只有在类的定义发生不兼容的更改时,才能在运行时发生此错误。
如果发生在运行时,请检查包含该方法的类是否在类路径中。
检查您是否添加了新版本的jar,并且方法是否兼容。

相关问题