方法存在时的Java NoSuchMethodError

标签 java nosuchmethoderror

我在 Speed 类中引用 PlayerUtil.getMovementSpeed(player);,在我的 PlayerUtil 类中,我将方法定义为:

public static double getMovementSpeed(Player player) {
  //my code here
}

但每当在我的其他类中引用 getMovementSpeed 方法时,它就会抛出此错误:

java.lang.NoSuchMethodError: net.Swedz.util.PlayerUtil.getMovementSpeed(Lorg/bukkit/entity/Player;)D

我以为可能是Eclipse导出不正确,但是我重新启动了它并再次尝试没有用。

编辑:我确实尝试反编译导出的 jar,导出的 jar 中确实存在 public static double getMovementSpeed(Player player) 方法。

编辑:我的 friend 也有类似的问题,并且使用的是 IntelliJ,所以 Eclipse 不是问题。

编辑: PlayerUtil 的类定义:

package net.Swedz.util;

public class PlayerUtil implements Listener {
    //getMovementSpeed is defined in here
}

速度类定义:

package net.Swedz.hack.detect.move;

public class Speed implements Hack, Listener {
    //my detection methods and method containing PlayerUtil.getMovementSpeed(player);
}

解决方案:我自己发现我的服务器上的两个插件之间存在类冲突。我有一个带有 net.Swedz.util.PlayerUtil 的 jar ,另一个带有 net.Swedz.util.PlayerUtil 的 jar ,两者的内容不同。我在 net.Swedz 之后添加了全部小写的项目名称,它似乎已经修复了!

谢谢!

最佳答案

这是一个非常容易解决的问题。 您已经使用了该方法,并且能够编译使用该方法的类。

这意味着在编译时它会引用具有此方法的 PlayerUtil 类。

但是运行时类加载器已经加载了不包含该方法的类PlayerUtil。 现在你要做的就是找出那个类是从哪里加载的(在运行时)

如果您可以在使用 eclipse/IDEA 运行时重现问题,请按照以下步骤操作。 (如果它在应用程序服务器或独立应用程序中运行,则在启用调试的情况下启动应用程序服务器或应用程序。您可以从您的 IDE 进行远程调试)。

  1. 在抛出异常的地方(您调用此方法的地方)放置一个断点。
  2. 开始调试,会遇到断点。
  3. 然后计算这个表达式 PlayerUtil.class.getResource("PlayerUtil.class")

4.可以找到类加载的路径。

现在你有两个选择,反编译类并检查该方法是否是这些(相同的返回类型、相同的名称、相同的参数)。

或者在调试中,您可以评估 PlayerUtil.class.getDeclaredMethods() 来找出答案。

因此,如果从错误的位置加载,您可以通过纠正类路径条目来解决问题。

关于方法存在时的Java NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42864427/

相关文章:

java - 如何继承循环泛型?

java - 如何使用 checkstyle 为某些方法强制执行静态导入?

java - 发布带有图像附件的加载电子邮件

java - setSerializationId 没有这样的方法报错

scala - (run-main-0) java.lang.NoSuchMethodError

java - Spring @Bean 配置和 Java 多态性

java - 试图解决NoSuchMethodError

spring - java.lang.NoSuchMethodError : org. springframework.web.context.support.ServletContextAwareProcessor:方法 <init>()V 未找到

java - 如何使用相同的库在 Eclipse 中编译和运行?

java - java的SecureRandom类中的getSeed()和generateSeed()函数之间的区别?