Minecraft(Forge 1.12.2)执行runClient时ExampleMod崩溃求助
解决Minecraft 1.12.2模组runClient任务崩溃(NetworkRegistry空指针异常)
问题详情
执行Gradle的runClient任务启动模组时出现崩溃:
- IntelliJ直接启动:抛出
java.lang.IllegalArgumentException与java.lang.NullPointerException,任务执行失败提示:Execution failed for task ':runClient'. > Process 'command 'C:\Program Files\Java\jdk1.8.0_202\bin\java.exe'' finished with non-zero exit value -1 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. - 控制台启动:生成崩溃报告,核心错误为
net.minecraftforge.fml.common.LoaderExceptionModCrash,根源指向NetworkRegistry.java第207行的NullPointerException。
环境信息
- Minecraft版本:1.12.2
- Java版本:1.8.0_202
- Gradle版本:4.10.3
- Forge版本:14.23.5.2859
已尝试操作:重启IntelliJ、更换Java版本、更换Gradle版本,问题未解决。
解决方案
1. 排查网络通道注册代码
1.12.2版本Forge的NetworkRegistry.java第207行空指针,90%以上是网络通道注册时传入空参数导致。重点检查模组中注册网络包的代码(通常在@Mod注解类的preInit/init阶段调用NetworkRegistry.INSTANCE.newSimpleChannel()的部分):
- 确保通道名称(Channel Name)为非空字符串,比如
"my_mod_channel" - 确保版本协议字符串(Version String)非空,比如
"1.0" - 如果使用重载方法,检查传入的
IChatSerializer或PacketDispatcher是否已完成实例化,无空对象
错误示例:
// 错误:通道名为空 NetworkRegistry.INSTANCE.newSimpleChannel(""); // 错误:版本字符串为null NetworkRegistry.INSTANCE.newSimpleChannel("my_channel", null, () -> "1.0", s -> true);
正确示例:
public static final SimpleNetworkWrapper NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel( "my_mod_channel", () -> "1.0", s -> s.equals("1.0"), s -> s.equals("1.0") );
2. 规范模组生命周期内的代码调用
避免在静态初始化块中提前调用网络注册代码——此时模组实例还未被FML初始化,易导致空指针。必须将网络注册放在FML生命周期方法中:
@Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { // 在此处执行网络通道注册 ModNetwork.init(); }
3. 清理并重建项目
- 执行Gradle清理任务清除旧构建文件:
gradlew clean - 带栈追踪参数重新启动客户端,定位自己代码中的具体错误行:
gradlew runClient --stacktrace
4. 检查第三方依赖兼容性
如果模组依赖其他第三方模组,确认这些模组的版本与当前Forge版本兼容,且已正确添加到项目依赖中,无依赖缺失导致的空对象问题。
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

