簡體   English   中英

方法存在時的Java NoSuchMethodError

[英]Java NoSuchMethodError when Method Exists

我正在引用PlayerUtil.getMovementSpeed(player); 在我的Speed類和我的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之后添加了我的項目名稱全部小寫,它似乎修復了它!

謝謝!

這是一個非常簡單的故障排除。 您已經使用了該方法,並且您能夠編譯使用此方法的類。

所以這意味着在編譯時它會使用具有此方法的類PlayerUtil。

但是運行時類加載器已經加載了不包含此方法的類PlayerUtil。 現在您要做的就是找出該類的加載位置(在運行時)

如果您可以在使用eclipse / IDEA運行時重新創建問題,請按照以下步驟操作。 (如果它在應用程序服務器或獨立應用程序中運行,則在啟用調試的情況下啟動應用程序服務器或應用程序。您可以從IDE進行遠程調試)。

  1. 設置一個斷點,拋出異常(你調用這個方法的地方)。
  2. 開始調試,它將達到斷點。
  3. 然后評估此表達式PlayerUtil.class.getResource("PlayerUtil.class")

4.你可以找到加載類的路徑。

現在你有兩個選項,反編譯該類並檢查該方法是否是這些(相同的返回類型,相同的名稱,相同的args)。

或者在調試中,您可以評估PlayerUtil.class.getDeclaredMethods()來查找。

因此,如果從錯誤的位置加載類路徑條目,則可以通過糾正類路徑條目來解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM