2014-01-21 106 views
-5

我在我的插件(Bukkit for Minecraft)中存在一個問題,該函數使得該函數在第733行(我切割了很多部分,線被分開)上拋出NullPointerException, HashMap類。這也可能是之前的狀況,我並不真正瞭解或理解正在發生的事情。在檢查.containsKey()之前,它在.get()上出錯。HashMap get方法返回NullPointerException

private float getTempFromArmor(Player player) { 
    float armorValue = 0.0F; 
    ItemStack helmet = player.getEquipment().getHelmet(); 
    ItemStack chestplate = player.getEquipment().getChestplate(); 
    ItemStack leggings = player.getEquipment().getLeggings(); 
    ItemStack boots = player.getEquipment().getBoots(); 
    HashMap<Material, Float> helmetValues = new HashMap<Material, Float>(); 
     helmetValues.put(Material.LEATHER_HELMET, 0.2F); 
     helmetValues.put(Material.IRON_HELMET, -0.2F); 
     helmetValues.put(Material.CHAINMAIL_HELMET, -0.1F); 
     helmetValues.put(Material.GOLD_HELMET, 0.1F); 
     helmetValues.put(Material.DIAMOND_HELMET, 0.0F); 
    HashMap<Material, Float> chestplateValues = new HashMap<Material, Float>(); 
     chestplateValues.put(Material.LEATHER_CHESTPLATE, 0.3F); 
     chestplateValues.put(Material.IRON_CHESTPLATE, -0.3F); 
     chestplateValues.put(Material.CHAINMAIL_CHESTPLATE, -0.15F); 
     chestplateValues.put(Material.GOLD_CHESTPLATE, 0.15F); 
     chestplateValues.put(Material.DIAMOND_CHESTPLATE, 0.0F); 
    HashMap<Material, Float> leggingsValues = new HashMap<Material, Float>(); 
     leggingsValues.put(Material.LEATHER_LEGGINGS, 0.2F); 
     leggingsValues.put(Material.IRON_LEGGINGS, -0.2F); 
     leggingsValues.put(Material.CHAINMAIL_LEGGINGS, -0.1F); 
     leggingsValues.put(Material.GOLD_LEGGINGS, 0.1F); 
     leggingsValues.put(Material.DIAMOND_LEGGINGS, 0.0F); 
    HashMap<Material, Float> bootsValues = new HashMap<Material, Float>(); 
     bootsValues.put(Material.LEATHER_BOOTS, 0.1F); 
     bootsValues.put(Material.IRON_BOOTS, -0.1F); 
     bootsValues.put(Material.CHAINMAIL_BOOTS, -0.05F); 
     bootsValues.put(Material.GOLD_BOOTS, 0.05F); 
     bootsValues.put(Material.DIAMOND_BOOTS, 0.0F); 

從這裏

 if (helmetValues.containsKey(helmet.getType())) 
      armorValue += helmetValues.get(helmet.getType()); 

要了這裏

 if (chestplateValues.containsKey(chestplate.getType())) 
      armorValue += chestplateValues.get(chestplate.getType()); 
     if (leggingsValues.containsKey(leggings.getType())) 
      armorValue += leggingsValues.get(leggings.getType()); 
     if (bootsValues.containsKey(boots.getType())) 
      armorValue += bootsValues.get(boots.getType()); 
    if (armorValue > 0) armorValue *= armorMax; 
    else armorValue *= armorMin; 
    return MathHelper.clamp_float(armorValue, armorMin, armorMax); 
} 

堆棧跟蹤:

[07:21:55 WARN]: [Hardcore Biomes] Task #4 for Hardcore Biomes v0.6.2 generated an exception 
java.lang.NullPointerException 
    at name.sml.franky1223.hardcorebiomes.HardcoreBiomes.getTempFromArmor(HardcoreBiomes.java:733) ~[?:?] 
    at name.sml.franky1223.hardcorebiomes.HardcoreBiomes.access$10(HardcoreBiomes.java:703) ~[?:?] 
    at name.sml.franky1223.hardcorebiomes.HardcoreBiomes$1.run(HardcoreBiomes.java:169) ~[?:?] 
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftTask.run(CraftTask.java:53) ~[craftbukkit-1.7.2-R0.2.jar:git-Bukkit-1.7.2-R0.2-b2974jnks] 
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:345) [craftbukkit-1.7.2-R0.2.jar:git-Bukkit-1.7.2-R0.2-b2974jnks] 
    at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:587) [craftbukkit-1.7.2-R0.2.jar:git-Bukkit-1.7.2-R0.2-b2974jnks] 
    at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250) [craftbukkit-1.7.2-R0.2.jar:git-Bukkit-1.7.2-R0.2-b2974jnks] 
    at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545) [craftbukkit-1.7.2-R0.2.jar:git-Bukkit-1.7.2-R0.2-b2974jnks] 
    at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457) [craftbukkit-1.7.2-R0.2.jar:git-Bukkit-1.7.2-R0.2-b2974jnks] 
    at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617) [craftbukkit-1.7.2-R0.2.jar:git-Bukkit-1.7.2-R0.2-b2974jnks] 

請幫助我,我很迷茫。先謝謝你。

+0

什麼是'材料'?一個'enum','class'?請顯示它的定義。 –

+0

如果你能告訴我們NullPointerException被拋出的確切行(這不僅僅是代碼片段中非常有用的行號),它會有所幫助。你能否將你的代碼縮減爲一個小例子來更好地展示和隔離問題?發佈[SSCCE](http://sscce.org/)將是最好的。 – andersschuller

+0

我已確定的代碼(732和733)的兩種可能的行: '如果(helmetValues.containsKey(helmet.getType())) armorValue + = helmetValues.get(helmet.getType());' – BinarMorker

回答

1

這個代碼不應該提出的NullPointerException

if (helmet != null) { 
Float helmetArmor = helmetValues.get(helmet.getType(); 
if (helmetArmor != null) { 
    armorValue += helmetArmor ; 
} 

}

也許你的球員還沒有頭盔?

+0

謝謝你的工作!我忘了檢查裝甲是否存在。非常感謝你! – BinarMorker

0

提供了所有的代碼是相同的方法,我懷疑問題是不太可能從該部分來:

helmet.getType() 

helmetValues.get(); 

,並更容易被來自何處嘗試改變它是這樣的:

if (helmet != null && helmetValues.containsKey(helmet.getType())) { 
    armorValue += helmetValues.get(helmet.getType()); 
}