如何修复NoSuchMethodError?

Joh*_*her 162 java nosuchmethoderror

NoSuchMethodError在运行Java程序时遇到错误.怎么了,怎么解决?

Vet*_*tle 217

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

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

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

  • 我们最近发现了其中一个的原因,结果发现构建过程在java服务器关闭之前放置了类文件,我们点击这个因为java服务器没有加载某些类,然后它确实加载了一些,但它有这些新的,并且因为新代码引用了旧类没有的方法... bingo,NoSuchMethodError (2认同)

Chr*_*row 107

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

第1步 - 添加.jar来构建路径

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

  • +1为"每个人都希望你知道如何使用它,如果你不这样做,他们就会对你的问题进行投票." (74认同)

eri*_*son 69

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

  • +1 NoSuchMethodException与NoSuchMethodError (10认同)
  • 换句话说,如果您使用反射来获取类上的方法并且未找到该方法,则会收到 NoSuchMethodException。但是,如果您遇到这样的情况:当您针对某些库编译代码并且服务器上有其他库(可能较新或较旧)时,您会收到 NoSuchMethodError 。如我错了请纠正我。 (2认同)

mat*_*t b 45

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

java -verbose:class <other args>
Run Code Online (Sandbox Code Playgroud)

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

...

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

...

  • +1 太棒了!我用这个方法解决了一个讨厌的小问题,谢谢。这是发现类何时以某种方式潜入类路径的绝佳方式。 (4认同)
  • +1 你救了我的一天!它只是一个在其源代码中包含同名旧类的库。 (2认同)

Joh*_*her 11

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

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

  • 实际上,对于使用任何 Java 开发框架:Maven、NetBeans 和 Apache Ant 的 Java 程序员来说,这感觉更像是一个突然出现的问题,正如您从这里的所有答案中看到的那样。 (2认同)

Hol*_*ger 6

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


小智 6

为什么有人没有提到依赖冲突?这个常见问题可能与包含的不同版本的依赖项 jar 有关。详细解释和解决方案:https ://dzone.com/articles/solving-dependency-conflicts-in-maven

简短回答;

添加这个maven依赖;

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
    <rules>
        <dependencyConvergence />
    </rules>
</configuration>
</plugin>

Run Code Online (Sandbox Code Playgroud)

然后运行这个命令;

mvn enforcer:enforce
Run Code Online (Sandbox Code Playgroud)

也许这就是您面临问题的原因。


rcr*_*ick 5

这也可能是使用反射的结果。如果您的代码反映在类上并按名称提取方法(例如: with Class.getDeclaredMethod("someMethodName", .....)),那么任何时候该方法名称发生更改,例如在重构期间,您都需要记住更新反射方法的参数以匹配新方法签名,否则getDeclaredMethod调用将抛出一个NoSuchMethodException.

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

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


Che*_*oft 5

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

例如

  • tomcat/常见/lib
  • mywebapp/WEB-INF/lib


小智 5

对我来说,发生这种情况是因为我将函数中的参数类型从 Object a 更改为 String a。我可以用 clean 来解决它并再次构建


inv*_*bl3 5

我有同样的错误:

  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)
Run Code Online (Sandbox Code Playgroud)

为了解决它,我首先检查了模块依赖关系图click in your POM the combination -> Ctrl+Alt+Shift+Uright click in your POM -> Maven -> Show dependencies)以了解库之间的冲突究竟在哪里(Intelij IDEA)。在我的特殊情况下,我有不同版本的 Jackson 依赖项。

在此处输入图片说明 在此处输入图片说明

1)因此,我直接在项目的 POM 中明确添加了最高版本 - 这两个版本中的 2.8.7。

在属性中:

<jackson.version>2.8.7</jackson.version>
Run Code Online (Sandbox Code Playgroud)

并作为依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

2)但也可以使用Dependency Exclusions解决。

通过与以下示例相同的原理:

  <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>
Run Code Online (Sandbox Code Playgroud)

不需要版本的依赖将从您的项目中排除。