方法存在时的Java NoSuchMethodError

时间:2017-03-17 18:08:26

标签: 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)方法。

编辑:我的朋友也有类似的问题,并且正在使用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后添加了所有小写的项目名称,似乎已经修复了它!

谢谢!

1 个答案:

答案 0 :(得分:6)

这是一个非常简单的故障排除方法。 您已经使用了该方法,并且您能够编译使用此方法的类。

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

但是运行时类加载器已经加载了PlayerUtil类,它不包含这个方法。 现在您要做的就是找出该类的加载位置(在运行时)

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

  1. 设置了抛出异常的断点(您调用此方法的地方)。
  2. 开始调试,它将达到断点。
  3. 然后评估此表达式PlayerUtil.class.getResource("PlayerUtil.class")
  4. 4.您可以找到加载类的路径。

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

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

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