You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:如何修复Minecraft 1.12实体注册时的java.lang.NullPointerException错误

解决Minecraft模组实体注册时的NullPointerException崩溃问题

嘿,我看了你折腾好久的这个崩溃问题——每次启动游戏都栽在java.lang.NullPointerException上,错误栈还指向实体注册的代码,这坑我之前也踩过,咱们一步步把它搞定。

错误原因分析

从你给出的错误栈来看,空指针是在EntityRegistry.doModEntityRegistration(EntityRegistry.java:207)抛出的,结合你的实体注册代码,大概率是这两个点出了问题:

  • ExampleMod.instance这个模组实例对象是空的
  • ExampleMod.ENTITY_HUMAN这个实体ID没有被正确初始化

具体解决方案

1. 确保模组主类的实例正确初始化

在你的ExampleMod主类里,必须保证用于注册的模组实例不为null。推荐用Forge提供的@Mod.Instance注解来获取实例,比自己new更可靠:

@Mod(modid = ExampleMod.MOD_ID, name = ExampleMod.NAME, version = ExampleMod.VERSION)
public class ExampleMod {
    public static final String MOD_ID = "sword";
    public static final String NAME = "The Human Tools Mod";
    public static final String VERSION = "1.0";

    // 用@Mod.Instance注解获取模组实例,确保不会为空
    @Mod.Instance(MOD_ID)
    public static ExampleMod modInstance;

    // 你的preInit方法,调用注册逻辑
    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        RegistryHandler.preInitRegistries();
    }
}

2. 正确定义实体ID常量

ExampleMod.ENTITY_HUMAN必须是一个已赋值的整数,而且不能和其他模组的实体ID冲突,比如在主类里明确赋值:

public class ExampleMod {
    // ... 其他常量
    public static final int ENTITY_HUMAN = 1; // 选一个未被占用的ID,比如1、2这类小整数
}

3. 修改实体注册代码

EntityInit里的注册方法改成使用正确的模组实例:

public class EntityInit {
    public static void registerEntities() {
        // 传入已正确赋值的ENTITY_HUMAN
        registerEntity("human", EntityHuman.class, ExampleMod.ENTITY_HUMAN, 50, 3093151, 16287108);
    }

    private static void registerEntity(String name, Class<? extends Entity> entityClass, int id, int trackingRange, int primaryColor, int secondaryColor) {
        EntityRegistry.registerModEntity(
            new ResourceLocation(ExampleMod.MOD_ID + ":" + name),
            entityClass,
            name,
            id,
            ExampleMod.modInstance, // 这里用@Mod.Instance注解获取的实例
            trackingRange,
            1,
            true,
            primaryColor,
            secondaryColor
        );
    }
}

额外检查点

  • 确认EntityHuman类已经正确继承了EntityLivingBase(或者适合的父类),并且类文件没有语法错误
  • 检查你的preInit阶段调用顺序是否正确,实体注册必须在FMLPreInitializationEvent事件中执行

改完这些之后,重新编译启动游戏,应该就能解决这个空指针崩溃的问题了。

内容的提问来源于stack exchange,提问作者Aiden Baker-Stanley

火山引擎 最新活动