方法存在时出现 Java NoSuchMethodError

问题描述 投票:0回答:2

我在 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,并且

public static double getMovementSpeed(Player player)
方法确实存在于导出的jar中。

编辑:我的朋友也有类似的问题,并且正在使用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
的罐子,另一个带有
net.Swedz.util.PlayerUtil
的罐子,两者的内容都不同。我在
net.Swedz
之后以全小写形式添加了我的项目名称,它似乎已经修复了!

谢谢!

java nosuchmethoderror
2个回答
16
投票

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

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

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

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

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

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

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

或者在 debug 中,您可以评估

PlayerUtil.class.getDeclaredMethods()
来找出答案。

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


0
投票

我遇到了同样疯狂的问题,两台服务器运行相同的发行包,一台工作正常,另一台则抛出 java.lag.NoSuchMethodError

问题是带有通配符的类路径 -cp lib/* 当我将其更改为 -cp lib/base.jar:lib/another.jar:lib/yetanother.jar 时, noSuchMethod 错误消失了。

非常奇怪,因为当使用 java -verbose:class 运行时,它在 NoSuchMethodError 之前显示了正确 jar 文件的完整路径。不知道为什么,很高兴找到解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.