如何修复NoSuchMethodError?
运行Java程序时出现" NoSuchMethodError"错误。有什么问题,我该如何解决?
解决方案
回答
这通常是在使用Apache Ant之类的构建系统时引起的,该构建系统仅在Java文件比类文件新时才编译Java文件。如果方法签名发生更改,并且类使用的是旧版本,则可能无法正确编译。通常的解决方法是进行完全重建(通常是" ant clean"然后是" ant")。
有时在针对库的一个版本进行编译但针对不同版本进行运行时,也可能导致这种情况。
回答
没有更多信息,很难找出问题所在,但根本原因是,我们可能是针对缺少该方法的该类的另一个版本编译了一个类,而不是运行该类时所使用的方法。
查看堆栈跟踪...如果在库中的对象上调用方法时出现异常,则很可能在编译和运行时使用库的不同版本。确保两个地方的版本都正确。
如果在对所创建的类实例化的对象上调用方法时出现异常,则说明构建过程似乎有问题。确保在编译时实际运行的类文件已更新。
回答
这也可能是使用反射的结果。如果代码反映了一个类,并按名称提取了一个方法(例如,带有Class.getDeclaredMethod(" someMethodName",.....)
),则方法名称每次更改时,例如在重构期间,我们将需要记住将参数更新到反射方法以匹配新方法的签名,否则调用getDeclaredMethod会抛出NoSuchMethodException。
如果是这个原因,那么堆栈跟踪应该显示反射方法已被调用的点,我们只需要更新参数以匹配实际的方法签名即可。
以我的经验,在对私有方法/字段进行单元测试并使用" TestUtilities"类提取字段以进行测试验证时,偶尔会遇到这种情况。 (通常使用的遗留代码在设计时并未考虑单元测试。)
回答
请注意,在反射的情况下,我们将获得NoSuchMethodException
,而在非反射代码中,将得到NoSuchMethodError
。当我遇到一个与另一个相对时,我倾向于去寻找截然不同的地方。
回答
如果要编写Web应用程序,请确保容器的全局库目录以及应用程序中的jar版本均不冲突。我们可能不一定知道类加载器正在使用哪个jar。
例如
- tomcat / common / lib
- mywebapp / WEB-INF / lib
回答
如果我们有权更改JVM参数,则添加详细的输出应使我们能够查看从哪些JAR加载了哪些类。
java -verbose:class <other args>
当程序运行时,JVM应该转储至标准输出信息,例如:
... [Loaded junit.framework.Assert from file:/C:/Program%20Files/junit3.8.2/junit.jar] ...
回答
我感到你很痛苦。我们可以从书本中学习编程,但是当涉及到Eclipse或者Visual Studio时,做一些简单的事情(例如添加库)是一个梦&以求的事情。每个人都希望我们知道如何使用它,如果我们不这样做,他们会否决问题。问题是,如果我们不在办公室里工作或者不认识任何人可以问这些问题,那么几乎不可能弄清楚这些东西。反正...
我遇到了问题,这就是我解决的方法。以下步骤是添加库的有效方法。我已经正确完成了前两个步骤,但是没有通过将" .jar"文件直接从文件系统拖到eclipse项目上的" lib"文件夹中来完成最后一个步骤。此外,我还必须从构建路径和" lib"文件夹中删除该库的先前版本。
如果有人知道添加/更新库的更正确方法,请输入提示音。