Java 如何修复NoSuchMethod错误?
运行Java程序时,我遇到了一个Java 如何修复NoSuchMethod错误?,java,nosuchmethoderror,Java,Nosuchmethoderror,运行Java程序时,我遇到了一个NoSuchMethodError错误。出现了什么问题以及如何修复它?这通常是在使用这样的生成系统时导致的,该系统仅在java文件比类文件新时才编译java文件。如果一个方法签名发生了变化,并且类使用了旧版本,那么可能无法正确编译。通常的修复方法是进行完全重建(通常是“ant clean”然后是“ant”) 有时,在针对库的一个版本进行编译但针对另一个版本运行时,也会导致此问题。如果没有更多信息,则很难确定问题所在,但根本原因可能是您针对缺少方法的类的另一个版本编
NoSuchMethodError
错误。出现了什么问题以及如何修复它?这通常是在使用这样的生成系统时导致的,该系统仅在java文件比类文件新时才编译java文件。如果一个方法签名发生了变化,并且类使用了旧版本,那么可能无法正确编译。通常的修复方法是进行完全重建(通常是“ant clean”然后是“ant”)
有时,在针对库的一个版本进行编译但针对另一个版本运行时,也会导致此问题。如果没有更多信息,则很难确定问题所在,但根本原因可能是您针对缺少方法的类的另一个版本编译了一个类,而不是运行它时使用的 看看堆栈跟踪。。。如果在对库中的对象调用方法时出现异常,则在编译和运行时很可能使用库的不同版本。确保两个地方都有正确的版本
如果在对由您创建的类实例化的对象调用方法时出现异常,那么您的构建过程似乎是错误的。确保编译时实际运行的类文件已更新。这也可能是使用反射的结果。如果您有反映类并按名称提取方法的代码(例如:with
class.getDeclaredMethod(“someMethodName”,…)
),那么每当方法名称更改时,例如在重构期间,您都需要记住更新反射方法的参数以匹配新方法签名,或者getDeclaredMethod
调用将抛出NoSuchMethodException
如果这是原因,那么堆栈跟踪应该显示调用反射方法的点,您只需要更新参数以匹配实际的方法签名
根据我的经验,当单元测试私有方法/字段,并使用
TestUtilities
类提取字段进行测试验证时,偶尔会出现这种情况。(通常使用未考虑单元测试的遗留代码。)注意,在反射的情况下,您会得到一个NoSuchMethodException
,而在非反射的代码中,您会得到NoSuchMethodError
。当我面对一个与另一个的时候,我倾向于寻找非常不同的地方。如果你正在编写一个Web应用程序,请确保你的容器的全局库目录和你的应用程序中没有jar的冲突版本。您可能不一定知道类加载器正在使用哪个jar
e、 g
- tomcat/common/lib
- mywebapp/WEB-INF/lib
java -verbose:class <other args>
java-verbose:class
程序运行时,JVM应转储到标准输出信息,例如:
[从文件加载junit.framework.Assert:/C:/Program%20Files/junit3.8.2/junit.jar]
我遇到了你的问题,我就是这样解决的。以下步骤是添加库的有效方法。我正确地完成了前两个步骤,但没有通过将“.jar”文件直接从文件系统拖到eclipse项目的“lib”文件夹中来完成最后一个步骤。此外,我必须从构建路径和“lib”文件夹中删除库的早期版本 步骤1-将.jar添加到构建路径 步骤2-关联源和javadocs(可选) 步骤3-实际将.jar文件拖到“lib”文件夹中(非可选)
回答原始问题。根据java文档: 如果应用程序尝试调用类(静态或实例)的指定方法,并且该类不再具有该方法的定义,则会引发“NoSuchMethodError” 通常,编译器会捕获此错误;只有在类的定义发生不兼容的更改时,才会在运行时发生此错误
在更改应用程序中的方法签名时,我遇到了类似的问题。
清理和重建我的项目解决了“NoSuchMethodError”问题。这些问题是由于在相同的两个类中使用相同的对象造成的。 使用的对象不包含新对象类包含的新方法 例:
filenotnull=/DayMoreConfig.conf
2015年7月16日05:02:10:ussdgw-1:在2775打开到SMSC的TCP/IP连接:10.149.96.66
2015年7月16日05:02:10:ussdgw-1:绑定请求:(bindreq:(pdu:090[1])900第52代(地址:020000))
线程“main”java.lang.NoSuchMethodError中出现异常:gateway.smpp.PDUEventListener。(Lgateway/smpp/USSDClient;)V
位于gateway.smpp.USSDClient.bind(USSDClient.java:139)
位于gateway.USSDGW.initSmppConnection(USSDGW.java:274)
在gateway.USSDGW.(USSDGW.java:184)
位于com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)
-bash-3.00美元
这些问题是由伴随而来的02个相似类(src中的1个,jar文件中的1个是gateway.jar)引起的。如果使用Maven或其他框架,并且几乎随机出现此错误,请尝试干净的安装,如
clean install
如果您编写了对象,并且知道它有方法,那么这很可能会起作用。我也遇到过同样的问题。当类中存在歧义时,也会导致这种情况。我的程序试图调用一个方法,该方法存在于同一位置/类路径中的两个JAR文件中。删除一个JAR文件或执行代码,以便只使用一个JAR文件。检查您使用的不是同一个JAR或不同的JAR
clean install
Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I
void invest(Currency money){...}
void invest(Euro money){...}
public static void main(String args[]) {
Bank myBank = new Bank();
Euro capital = new Euro();
myBank.invest(capital);
}
#7 = Methodref #2.#22 // Bank.invest:(LCurrency;)V
App/
src/
com.example/
Projection.java
Test/
src/
com.example/
Projection.java
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object;)V
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)
<jackson.version>2.8.7</jackson.version>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
mvn enforcer:enforce