重载与错误处理
基本信息
| 属性 | 值 |
|---|---|
| 入口 | CustomMainMenu.reload()(CustomMainMenu.java:69-82) |
| 触发方式 1 | 重载配置(refresh) 动作 |
| 触发方式 2 | 重载配置热键(Ctrl+Shift) |
| 错误提示 | 主菜单左上角红字,持续 5 秒 |
启动期 vs 运行期
两条加载路径的失败处理完全不同:
启动期(preInit) |
运行期(reload()) |
|
|---|---|---|
| 失败结果 | log(ERROR, "Error while loading config file. Will have to crash here :(") 后 throw new RuntimeException → 游戏崩 |
记 ERROR 日志,恢复旧 config 继续用 |
| 界面提示 | 无(已经崩了) | 红字 "Error loading config file, see console for more information" |
回滚机制
reload() 先把当前 config 存进 backup,再整体重建(CustomMainMenu.java:70-81):
1. backup = this.config
2. this.config = new Config() // 全新空表
3. this.configLoader = new ConfigurationLoader(this.config)
4. try configLoader.load()
成功 → EVENT_HANDLER.displayMs = -1L // 清除错误提示
失败 → EVENT_HANDLER.displayMs = 当前时间戳
log(ERROR, "Error while loading new config file, trying to keep the old one loaded.")
this.config = backup // ← 回滚
因为 Config 持有的是已构建好的 GuiCustom 引用(不是文件路径),回滚后旧界面对象完好无损,不会有半加载状态。
红字提示
CMMEventHandler.renderScreenPost(EventPriority.HIGHEST)在 displayMs != -1L 时绘制(CMMEventHandler.java:112-123):
| 属性 | 值 |
|---|---|
| 内容 | Error loading config file, see console for more information |
| 位置 | (0, 80) — 固定像素,不随分辨率缩放 |
| 颜色 | 16711680(0xFF0000) |
| 时长 | System.currentTimeMillis() - displayMs < 5000L,即 5 秒后自动消失并把 displayMs 复位为 -1 |
| 触发 | 任意 DrawScreenEvent.Post,所以在哪个界面出错就在哪个界面显示 |
⚠️ 因为 5 秒后自动清除,同一次坏配置的后续重载失败会重新计时,红字会反复出现。
已知脆弱点
⚠️ reload() 不是线程安全的,但快捷键是每 tick 轮询(GuiCustom.java:458)。按键持续按住时会每 tick 完整重读一遍磁盘上所有 JSON——按住 Ctrl+Shift 一秒就是 20 次全量重载。实际后果是配置目录的读 IO 风暴,且 Config / EVENT_HANDLER.actualGui 等静态字段在重载过程中处于中间态。
⚠️ 重载时正显示着的界面实例不会自动刷新——reload() 之后必须 displayGuiScreen 才能看到新配置。重载配置(refresh) 动作和热键路径都显式做了这一步。
⚠️ preInit 里的 ConfigurationLoader.load() 同样没有健壮性保障:任何一处 JSON 语法错/字段缺失都会让整个整合包无法启动(见 配置文件格式)。
相关条目
- 重载配置(refresh) - 动作触发路径
- 重载配置热键 - 键盘触发路径
- 配置文件格式 - 哪些写法会触发加载失败