Spigot自定义装备插件启用时报NullPointerException错误求助
问题原因排查
1. 触发空指针的核心原因
你在createEmeraldHelmet和createEmeraldBoots方法中编写第二个合成配方时,存在变量名书写错误:
// 声明了新的配方对象s ShapedRecipe s = new ShapedRecipe(NamespacedKey.minecraft("emeraldhelmet"), item); // 所有配置操作仍然针对之前的sr对象,新对象s完全没有配置合成规则 sr.shape(" ", "EEE", "B B"); sr.setIngredient('E', Material.EMERALD); sr.setIngredient('B', Material.EMERALD_BLOCK); // 此时s的rows属性为null,注册时就会抛出你遇到的空指针异常 Bukkit.getServer().addRecipe(s);
createEmeraldBoots方法的第二个配方存在完全相同的问题,未配置的配方对象直接注册触发报错。
2. IntelliJ提示setDisplayName空指针风险的原因
ItemStack.getItemMeta()方法在极端场景下可能返回null,直接调用setDisplayName会触发空指针,建议增加非空判断规避风险。
3. 额外隐藏问题
同一物品的两个合成配方使用了相同的NamespacedKey,会导致后注册的配方覆盖先注册的,最终仅能生效一个合成方案。
修复方案
1. 修复createEmeraldHelmet方法示例
public static void createEmeraldHelmet() { ItemStack item = new ItemStack(Material.LEATHER_HELMET); // 增加非空判断解决setDisplayName空指针警告 ItemMeta meta = item.getItemMeta(); if (meta != null) { meta.setDisplayName("§2Emerald Helmet"); LeatherArmorMeta leatherArmorMeta = (LeatherArmorMeta) meta; leatherArmorMeta.setColor(Color.GREEN); AttributeModifier armor = new AttributeModifier(UUID.randomUUID(), "generic.armor", 3, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD); meta.addAttributeModifier(Attribute.GENERIC_ARMOR, armor); AttributeModifier armortoughness = new AttributeModifier(UUID.randomUUID(), "generic.armortoughness", 2, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HEAD); meta.addAttributeModifier(Attribute.GENERIC_ARMOR_TOUGHNESS, armortoughness); meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); item.setItemMeta(meta); } emeraldhelmet = item; // 第一个配方使用唯一key ShapedRecipe sr = new ShapedRecipe(NamespacedKey.minecraft("emeraldhelmet_top"), item); sr.shape("EEE", "B B", " "); sr.setIngredient('E', Material.EMERALD); sr.setIngredient('B', Material.EMERALD_BLOCK); Bukkit.getServer().addRecipe(sr); // 第二个配方使用唯一key,修正操作对象为s ShapedRecipe s = new ShapedRecipe(NamespacedKey.minecraft("emeraldhelmet_bottom"), item); s.shape(" ", "EEE", "B B"); s.setIngredient('E', Material.EMERALD); s.setIngredient('B', Material.EMERALD_BLOCK); Bukkit.getServer().addRecipe(s); }
2. 同步修复createEmeraldBoots方法
参照上面的写法,将第二个配方的操作对象从sr改为s,同时给两个配方分配不同的NamespacedKey即可。
内容的提问来源于stack exchange,提问作者WASD_Noob
相关产品推荐
相关产品推荐

