Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复NoSuchMethod错误?_Java_Nosuchmethoderror - Fatal编程技术网

Java 如何修复NoSuchMethod错误?

Java 如何修复NoSuchMethod错误?,java,nosuchmethoderror,Java,Nosuchmethoderror,运行Java程序时,我遇到了一个NoSuchMethodError错误。出现了什么问题以及如何修复它?这通常是在使用这样的生成系统时导致的,该系统仅在java文件比类文件新时才编译java文件。如果一个方法签名发生了变化,并且类使用了旧版本,那么可能无法正确编译。通常的修复方法是进行完全重建(通常是“ant clean”然后是“ant”) 有时,在针对库的一个版本进行编译但针对另一个版本运行时,也会导致此问题。如果没有更多信息,则很难确定问题所在,但根本原因可能是您针对缺少方法的类的另一个版本编

运行Java程序时,我遇到了一个
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

如果您有权更改JVM参数,添加详细输出应该允许您查看从哪些JAR文件加载哪些类

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”

通常,编译器会捕获此错误;只有在类的定义发生不兼容的更改时,才会在运行时发生此错误

  • 如果发生在运行时,请检查包含该方法的类是否在类路径中
  • 检查您是否添加了JAR的新版本,以及该方法是否兼容

  • 在更改应用程序中的方法签名时,我遇到了类似的问题。
    清理和重建我的项目解决了“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