2015-09-19 20 views
-1

(對不起,我的英語不好,我來自法國)。Java NMS方法return NullPointerException

我正在做一個bukkit插件序列化索姆河項目。我使用本地序列化系統(實現Serializable ...)。然後我創建了一個名爲SerializableItemStack的類(下面的源代碼)。

public static SerializableItemStack fromItemStack(ItemStack stack) { 
    try { 
     net.minecraft.server.v1_7_R4.ItemStack cis = CraftItemStack 
       .asNMSCopy(stack); 
     if (stack == null) { 
      System.out.println("Stack is null"); 
      return null; 
     } 
     if (cis == null) { 
      System.out.println("Cis is null"); 
      return null; 
     } 

     SerializableNBTTagCompound nbt = null; 
     if (cis.hasTag()) { 
      nbt = SerializableNBTTagCompound.fromNBTTagCompound(cis.tag); 
     } 
     return new SerializableItemStack(stack.getType().name(), 
       stack.getDurability(), stack.getAmount(), nbt, 
       stack.getItemMeta()); 
    } catch (java.lang.NullPointerException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

問題是CraftItemStack.asNMSCopy方法返回null。我不知道爲什麼。

輸出

Cis is null 

回答

0

如果你看看CraftItemStack.asNMSCopysource code有幾種可能 - 根據傳遞的棧對象上 - 爲什麼它返回null,即使堆棧對象不爲空。

因此,如果您確實需要一個非空的返回值,那麼返回的null是OK,或者您必須清理堆棧對象。

+0

我想撒旦意味着顯示有關堆棧的信息? '類型:COOKED_BEEF 金額:52 耐久度:0 有沒有附魔 無顯示名稱 已經沒有lores' – Sam54

+0

@ Sam54的sanitize與我的意思如下:如果你真的需要'asNMSCopy(棧)'不返回null如果存在,則可以拋出一個'IllegalArgumentException'來向調用者發出信號,表明堆棧對象不能被序列化。但是這取決於你的代碼的語義 – wero

+0

好的。我發現了這個問題。 CraftItemStack類請求服務器ID列表並使用它將該項目轉換爲nms項目。該方法返回null,因爲我在腳本中使用該方法。但腳本不啓動服務器。我必須使用它作爲服務器插件:)。 – Sam54