首页 文章

如何修复NoSuchMethodError?

提问于
浏览
122

运行Java程序时出现 NoSuchMethodError 错误 . 怎么了,怎么解决?

25 回答

  • 10

    试试这种方法:删除项目目录下的所有.class文件(当然还有所有子目录) . 重建 .

    有时 mvn clean (如果您使用的是maven)不会清除由 javac 手动创建的.class文件 . 那些旧文件包含旧签名,导致 NoSuchMethodError .

  • 1

    只需添加现有答案 . 我在eclipse中遇到了tomcat这个问题 . 我改变了一个 class 并做了以下步骤,

    • 在eclpise中清理并构建了项目

    • mvn clean install

    • 重启tomcat

    我仍面临同样的错误 . 然后 I cleaned tomcat, cleaned tomcat working directory 并重新启动服务器,我的问题消失了 . 希望这有助于某人

  • 0

    我在应用程序中更改方法签名时遇到了类似的问题 . 清理和重建我的项目解决了“NoSuchMethodError” .

  • 0

    对我来说,这是因为我在函数中更改了参数类型,从Object a到String a . 我可以用干净解决它并再次构建

  • 0

    我感觉到你的痛苦 . 你可以从一本书中学习编程,但是当涉及到使用Eclipse或Visual Studio时,它们会向你的问题提供帮助 . ^&^&'n nightmare to do something simple like add a library. Everybody expects you to know how to use it and if you don' t . 问题是,如果你不在办公室工作或认识任何你可以提出这些问题的人,那么几乎不可能把这些东西弄清楚 . 无论如何...

    我遇到了你的问题,这就是我修复它的方法 . 以下步骤是添加库的有效方法 . 我已经完成了前两步,但是我没有通过将“.jar”文件直接从文件系统拖到我的eclipse项目的“lib”文件夹中来完成最后一步 . 此外,我不得不从构建路径和“lib”文件夹中删除以前版本的库 .

    如果有人知道添加/更新库的更合适的方法,请加入 .

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

    enter image description here

    步骤2 - 关联源和javadoc(可选)

    enter image description here

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

    enter image description here

  • 0

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

    java -verbose:class <other args>
    

    运行程序时,JVM应转储到标准输出信息,例如:

    ... [从文件中加载junit.framework.Assert:/ C:/Program%20Files/junit3.8.2/junit.jar] ...

  • 3

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

  • 0

    我的问题是在构建路径中有两个版本的同一个库 . 旧版本的库没有这个功能,而较新版本的功能也没有 .

  • 4

    使用Intelij我的Gradle项目遇到了类似的问题 . 我通过删除.gradle(见下面的截图)包解析并重建项目来解决它 . .gradle Package

  • 0

    大多数情况下,java.lang.NoSuchMethodError被捕获为编译器,但有时它可能在运行时发生 . 如果在运行时发生此错误,那么唯一的原因可能是类结构的更改使其不兼容 .

    最佳说明:https://www.journaldev.com/14538/java-lang-nosuchmethoderror

  • 0

    如果使用maven或其他框架,并且几乎随机地得到此错误,请尝试“clean install”,特别是如果您编写了对象并且您知道它具有该方法 . 为我工作 .

  • 182

    在没有任何更多信息的情况下,很难确定问题,但根本原因是您很可能已经针对缺少方法的类的不同版本编译了一个类,而不是运行它时使用的类 .

    查看堆栈跟踪...如果在库中的对象上调用方法时出现异常,则在编译和运行时很可能使用库的单独版本 . 确保两个地方都有正确的版本 .

    如果在由您创建的类实例化的对象上调用方法时出现异常,那么您的构建过程似乎有问题 . 确保编译时更新实际运行的类文件 .

  • 4

    回答原始问题 . 根据java docs here

    “NoSuchMethodError”如果应用程序试图调用类的指定方法(静态或实例),并且该类不再具有该方法的定义,则抛出该异常 .

    通常,编译器会捕获此错误;如果类的定义不兼容地更改,则此错误只能在运行时发生 .

    • 如果它在运行时发生,请检查包含该方法的类是否在类路径中 .

    • 检查是否添加了新版本的JAR,并且该方法兼容 .

  • 60

    这意味着类中没有相应的方法:

    • 如果你正在使用jar然后反编译并检查相应版本的jar是否具有适当的类 .

    • 检查您是否从源代码编译了正确的类 .

  • 39

    这些问题是由在同一两个类中使用相同对象引起的 . 使用的对象不包含新对象类所包含的新方法 .

    例如:

    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)

  • 0

    我也遇到过这个错误 .

    我的问题是我改变了一个方法的签名,比如说

    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);
    }
    

    编译器在警告/错误方面保持沉默,因为资本既是货币也是欧元 .

    问题的出现是因为我只编译了定义方法的类--Bank,而不是从中调用方法的类,它包含main()方法 .

    这个问题不是您可能经常遇到的问题,因为最常见的是项目是手动重建或自动触发构建操作,而不是仅编译一个修改过的类 .

    我的用例是我生成了一个.jar文件,该文件将用作修补程序,它不包含App.class,因为它未被修改 . 我有意义的是不要包含它,因为我保留了初始参数的基类通过继承 .

    问题是,当你编译一个类时,生成的字节码是静态的,换句话说,它是一个硬参考 .

    原始的反汇编字节码(使用javap工具生成)如下所示:

    #7 = Methodref          #2.#22         // Bank.invest:(LCurrency;)V
    

    在ClassLoader加载新编译的Bank.class之后,它将找不到这样的方法,它看起来好像已被删除而未被更改,因此命名错误 .

    希望这可以帮助 .

  • -2

    如果您的文件名与包含main方法的类名不同,则可能是此错误可能导致的 .

  • 2

    如果您正在编写Web应用程序,请确保容器的全局库目录中以及应用程序中没有冲突版本的jar . 您可能不一定知道类加载器正在使用哪个jar .

    例如

    • tomcat / common / lib

    • mywebapp / WEB-INF / lib

  • 2

    我通过重命名Junit测试文件在Eclipse中解决了这个问题 .
    在我的Eclipse工作空间中,我有一个App项目和一个Test项目 .
    Test项目将App项目作为构建路径上的必需项目 .

    开始得到NoSuchMethodError .
    然后我意识到Test项目中的类与App项目中的类具有相同的名称 .

    App/  
      src/
         com.example/  
           Projection.java
    Test/  
      src/
         com.example/
           Projection.java
    

    将Test重命名为正确的名称“ProjectionTest.java”之后,异常就消失了 .

  • 2

    请注意,在反射的情况下,您得到 NoSuchMethodException ,而使用非反射代码,您得到 NoSuchMethodError . 当面对一个与另一个相比时,我倾向于在非常不同的地方寻找 .

  • 0

    我遇到了类似的问题 .

    Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I
    

    最后我确定了根本原因是改变了变量的数据类型 .

    • Employee.java - >包含其数据类型已从 int 更改为 String 的变量( EmpId ) .

    • ReportGeneration.java - >使用getter getEmpId() 检索值 .

    我们应该通过仅包含修改的类来重新绑定jar . 由于 ReportGeneration.java 没有变化,我只在Jar文件中包含 Employee.class . 我必须在jar中包含 ReportGeneration.class 文件才能解决问题 .

  • 103

    我遇到了同样的问题 . 当类中存在歧义时也会导致这种情况 . 我的程序试图调用一个方法,该方法存在于同一位置/类路径中的两个JAR文件中 . 删除一个JAR文件或执行代码,以便只使用一个JAR文件 . 检查您是否使用相同的JAR或包含相同类的相同JAR的不同版本 .

    DISP_E_EXCEPTION [step] [] [Z-JAVA-105 Java异常java.lang.NoSuchMethodError(com.example.yourmethod)]

  • 2

    这通常是在使用像Apache Ant这样只在java文件比类文件更新时编译java文件的构建系统时引起的 . 如果方法签名发生更改且类使用旧版本,则可能无法正确编译 . 通常的修复方法是进行完全重建(通常是"ant clean"然后"ant") .

    有时,在针对一个版本的库进行编译但针对不同版本运行时也会导致这种情况 .

  • 2

    上面的答案解释得很好..只是添加一件事如果你使用eclipse使用ctrl shift T并输入类的包结构(例如:gateway.smpp.PDUEventListener),你会发现它所在的所有jar /项目 . 从类路径中删除不必要的jar或在类路径中添加上面的jar . 现在它会找到正确的 .

  • 1

    这也可能是使用反射的结果 . 如果您有代码反映在类上并按名称提取方法(例如:使用 Class.getDeclaredMethod("someMethodName", .....) ),那么只要方法名称发生更改(例如在重构期间),您就需要记住将参数更新为反射匹配新方法签名的方法,或 getDeclaredMethod 调用将抛出 NoSuchMethodException .

    如果这是原因,那么堆栈跟踪应该显示调用反射方法的点,并且您只需要更新参数以匹配实际的方法签名 .

    根据我的经验,当单元测试私有方法/字段并使用 TestUtilities 类提取字段以进行测试验证时,偶尔会出现这种情况 . (通常使用未考虑单元测试而设计的遗留代码 . )

相关问题