重载与错误处理

基本信息

属性 值
入口 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 语法错/字段缺失都会让整个整合包无法启动(见 配置文件格式)。

相关条目