API 参考 / registry 包:注册表与资源标识
RegistryFrozenException
注册表被冻结后仍尝试写入时抛出的异常,继承 IllegalStateException。它表示调用时机错了,而不是数据错了:注册窗口已经一次性关闭。
何时发生:宿主在启动装配阶段完成全部模组的注册回调后立即冻结所有注册表;此后(游戏运行期、渲染回调内、热启用模组的 onPreInit 内、以及 onInit / onPostInit 内)任何写入都会抛本异常。这是刻意的严格模型:运行期注册表不再抖动,因此「模组停用/启用需要重启才生效」。
模组不应捕获本异常去规避——正确做法是把注册放回启动期 onPreInit 回调里。仅可在诊断代码中捕获并记录,用来提示调用位置错误。
方法速览
| 方法 | 用途 |
|---|---|
RegistryFrozenException(String) | 以说明文案构造异常 |
完整签名
java
public class RegistryFrozenException extends IllegalStateException {
public RegistryFrozenException(String message);
}RegistryFrozenException(String)
签名:
java
public RegistryFrozenException(String message);行为:唯一构造器,把 message 原样交给 IllegalStateException。类中没有无参构造器,宿主抛出的文案会带上注册表名与尝试注册的键(如「xxx 已冻结,不能再注册 mymod:foo(注册只允许在模组 onPreInit 窗口内进行)」)。
注意校验顺序:宿主在检查冻结之前先做键/值/类型校验,因此非法参数在冻结后依然报 IllegalArgumentException;per-mod 视图的归属校验也先于冻结检查。
示例:
java
try {
ctx.registries().skins().register(key, skin);
} catch (RegistryFrozenException e) {
// 时间点错误:把这次注册移回 onPreInit,不要在这里重试
ctx.getLogger().severe("registration window closed: " + e.getMessage());
}线程:源码未声明额外线程约束(异常实例按调用线程创建)。
生命周期阶段:运行期可能出现的失败信号(包括热启用模组的 onPreInit 场景);注册窗口内正常写入不会触发。
稳定性:2.0 起冻结:2.x 内只增不破(禁止删签名 / 改签名 / 改语义)。