You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:39:02