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

Minecraft模组开发:MinecraftClient.getInstance().player返回空指针问题求助

解决Minecraft Fabric模组获取玩家DisplayName的空指针异常

你遇到的空指针异常确实是因为模组初始化阶段(onInitialize方法)执行时,Minecraft客户端还未完成初始化,玩家实体(PlayerEntity)尚未创建,此时调用MinecraftClient.getInstance().player会得到null,进而触发NullPointerException。

核心原因

onInitialize是Fabric模组的加载入口,这个方法在游戏启动初期就会执行,此时客户端还处于启动流程中,玩家还未进入世界,自然不存在玩家实体对象。

解决方案:使用Fabric的客户端事件监听

Fabric提供了多种客户端生命周期事件,你可以通过注册这些事件,在合适的时机执行获取玩家信息的代码。

方案1:监听客户端启动完成事件

当客户端完全启动后触发该事件,但需注意此时可能还未进入世界,需要判断玩家是否存在:

修改SimpleMod.java:

package net.arecdev.simplemod;

import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.lifecycle.v1.ClientLifecycleEvents;
import net.arecdev.simplemod.test.TestClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleMod implements ModInitializer {
    public static final String MOD_ID = "simplemod";
    public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

    @Override
    public void onInitialize() {
        LOGGER.info("Simple Mod has started");

        // 注册客户端启动完成事件
        ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
            if (client.player != null) {
                String playerName = TestClass.getPlayerDisplayName(client.player);
                LOGGER.info("玩家显示名称: " + playerName);
            } else {
                LOGGER.info("尚未进入世界,无法获取玩家信息");
            }
        });
    }
}

修改TestClass.java,改为接收玩家实体参数的方法(避免直接依赖客户端实例,代码更健壮):

package net.arecdev.simplemod.test;

import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.Text;

public class TestClass {

    public static String getPlayerDisplayName(PlayerEntity player) {
        Text playerDisplayName = player.getDisplayName();
        return playerDisplayName.getString();
    }
}

方案2:监听玩家加入世界事件(更可靠)

当玩家成功加入世界(包括单人游戏或服务器)时触发该事件,此时玩家实体肯定存在,是获取玩家信息的最佳时机:

修改SimpleMod.java:

package net.arecdev.simplemod;

import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.arecdev.simplemod.test.TestClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleMod implements ModInitializer {
    public static final String MOD_ID = "simplemod";
    public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

    @Override
    public void onInitialize() {
        LOGGER.info("Simple Mod has started");

        // 注册玩家加入世界事件
        ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
            String playerName = TestClass.getPlayerDisplayName(client.player);
            LOGGER.info("玩家 " + playerName + " 已加入世界");
        });
    }
}

TestClass.java的修改同方案1。

注意事项

  • 不要在onInitialize方法中直接访问MinecraftClient.getInstance().player,此时客户端和玩家实体都未准备就绪。
  • 优先使用事件监听的方式执行依赖客户端状态的代码,这是Fabric模组开发的标准实践。

内容的提问来源于stack exchange,提问作者Secure Aviator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:05:01