2013-02-01 164 views
-3

我正在嘗試使用Java bukkit創建一個minecraft插件。Java錯誤:無法解析爲變量

@EventHandler 
public void onItemDrop(PlayerDropItemEvent e) { 
    /* 
    * Dropping items 
    */ 
    Item item = e.getItemDrop(); 
    item.setMetadata("NODROP", new FixedMetadataValue(plugin, e.getPlayer())); 
    if (!e.getPlayer().hasPermission("nodrop.drop")) { 
     e.getItemDrop().remove(); 
     e.getPlayer().sendMessage(colorizeText(ChatColor.RED + getConfig().getString("drop-message"))); 
    } 
} 

我得到的錯誤是 '插件' 上

item.setMetadata("NODROP", new FixedMetadataValue(plugin, e.getPlayer())); 

是:

插件不能被解析到一個變量

請幫幫忙!

+2

你沒有在任何地方定義'plugin',那麼當你告訴它將'plugin'傳遞給'FixedMetadataValue()'時,Java應該如何知道要使用什麼? – us2012

+4

首先想想,'plugin'的類型是什麼?那麼想想,你有沒有在該方法中指定? –

+2

嗯,這意味着你沒有名爲「插件」的變量,顯然是不夠的...... – fge

回答

0

所以需要採取什麼是像這樣的代碼方法體中的一行:

Plugin plugin = new Plugin(); 

或者你可以聲明plugin作爲一個實例變量:

public class Foo 
{ 
    private Plugin plugin; //initialize later 
    ... 
    public void onItemDrop(PlayerDropItemEvent e) { 
    ... 
    } 
} 
0

我不認爲@ Woot4Moo的回答是正確的。很坦率地說;它會在您運行插件時拋出錯誤。

上述錯誤可以固定在以下兩種方法之一:

更改插件來此
如果你的事件監聽是在主插件類(擴展JavaPlugin的一個),那麼你可以簡單地改變plugin節至this
item.setMetadata("NODROP", new FixedMetadataValue(this, e.getPlayer()));

獲得一個插件的實例
如果你的事件監聽是在你的插件的另一部分則在聲明監聽器將其更改爲getServer().getPluginManager().registerEvents(this, new SomeEventListener(this),並作出建築工是需要發送的插件實例,並將其存儲。

public SomeEventListener(JavaPlugin instance) { 
    this.plugin = instance; 
} 

然後你可以簡單的離開item.setMetadata。

+0

OP的問題並不是以正確的方式獲取JavaPlugin類,這是對如何分配/分配對象的根本性誤解。所以我建議你的回答實際上是不正確的,因爲它不適用於所有這些情況。 – Woot4Moo

+0

@ Woot4Moo如果OP運行此代碼:'item.setMetadata(「NODROP」,new FixedMetadataValue(new Plugin(),e.​​getPlayer()));'它會拋出一個錯誤導致插件無法工作。 – Kezz101