s (2) --- [x2] Lua((MOD:CleanUI)).getConfig(CleanUIConfig.lua:410) java.util.Unk...

2026年08月26日 21:29 40.88 秒 success

错误信息

``` === Zomboid Settings === Version: 42.20.4 b0bbce05d5 (Steam) Mode: SINGLE PLAYER [CleanUI - Mod Report] --- Associated Errors (2) --- [x2] Lua((MOD:CleanUI)).getConfig(CleanUIConfig.lua:410) java.util.UnknownFormatConversionException: Conversion = ')' at java.base/java.util.Formatter.parse(Unknown Source) at java.base/java.util.Formatter.format(Unknown Source) at java.base/java.util.Formatter.format(Unknown Source) at java.base/java.lang.String.format(Unknown Source) at zombie.debug.DebugLogStream.printException(DebugLogStream.java:637) at zombie.debug.DebugType.printException(DebugType.java:300) at zombie.core.Translator.reportMissingArgumentsFromPastAbuse(Translator.java:515) at zombie.core.Translator.getText(Translator.java:502) at zombie.Lua.LuaManager$GlobalObject.getText(LuaManager.java:7279) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at se.krka.kahlua.integration.expose.caller.MethodCaller.call(MethodCaller.java:58) at se.krka.kahlua.integration.expose.LuaJavaInvoker.call(LuaJavaInvoker.java:194) at se.krka.kahlua.integration.expose.LuaJavaInvoker.call(LuaJavaInvoker.java:184) at se.krka.kahlua.vm.KahluaThread.callJava(KahluaThread.java:178) at se.krka.kahlua.vm.KahluaThread.luaMainloop(KahluaThread.java:795) at se.krka.kahlua.vm.KahluaThread.call(KahluaThread.java:162) at se.krka.kahlua.vm.KahluaThread.pcall(KahluaThread.java:1740) at se.krka.kahlua.vm.KahluaThread.pcallvoid(KahluaThread.java:1572) at se.krka.kahlua.integration.LuaCaller.pcallvoid(LuaCaller.java:60) at se.krka.kahlua.integration.LuaCaller.protectedCallVoid(LuaCaller.java:131) at zombie.Lua.Event.trigger(Event.java:55) at zombie.Lua.LuaEventManager.triggerEvent(LuaEventManager.java:248) at zombie.core.Core.ResetLua(Core.java:4208) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at se.krka.kahlua.integration.expose.caller.MethodCaller.call(MethodCaller.java:58) at se.krka.kahlua.integration.expose.LuaJavaInvoker.call(LuaJavaInvoker.java:194) at se.krka.kahlua.integration.expose.MultiLuaJavaInvoker.call(MultiLuaJavaInvoker.java:59) at se.krka.kahlua.vm.KahluaThread.callJava(KahluaThread.java:178) at se.krka.kahlua.vm.KahluaThread.luaMainloop(KahluaThread.java:795) at se.krka.kahlua.vm.KahluaThread.call(KahluaThread.java:162) at se.krka.kahlua.vm.KahluaThread.pcall(KahluaThread.java:1740) at se.krka.kahlua.vm.KahluaThread.pcallBoolean(KahluaThread.java:1676) at se.krka.kahlua.integration.LuaCaller.protectedCallBoolean(LuaCaller.java:96) at zombie.ui.UIElement.onMouseUp(UIElement.java:1411) at zombie.ui.UIElement.onMouseUp(UIElement.java:1384) at zombie.ui.UIElement.onMouseUp(UIElement.java:1384) at zombie.ui.UIElement.onConsumeMouseButtonUp(UIElement.java:1474) at zombie.ui.UIManager.updateMouseButtons(UIManager.java:747) at zombie.ui.UIManager.update(UIManager.java:621) at zombie.GameWindow.logic(GameWindow.java:347) at zombie.GameWindow.frameStep(GameWindow.java:790) at zombie.GameWindow.mainThreadStep(GameWindow.java:567) at zombie.MainThread.mainLoop(MainThread.java:69) at java.base/java.lang.Thread.run(Unknown Source) [x2] Lua((MOD:CleanUI)).getConfig(CleanUIConfig.lua:410) java.lang.RuntimeException: Object tried to call nil in getConfig at se.krka.kahlua.vm.KahluaUtil.fail(KahluaUtil.java:100) at se.krka.kahlua.vm.KahluaThread.luaMainloop(KahluaThread.java:763) at se.krka.kahlua.vm.KahluaThread.call(KahluaThread.java:162) at se.krka.kahlua.vm.KahluaThread.pcall(KahluaThread.java:1740) at se.krka.kahlua.vm.KahluaThread.pcallvoid(KahluaThread.java:1572) at se.krka.kahlua.integration.LuaCaller.pcallvoid(LuaCaller.java:60) at se.krka.kahlua.integration.LuaCaller.protectedCallVoid(LuaCaller.java:131) at zombie.Lua.Event.trigger(Event.java:55) at zombie.Lua.LuaEventManager.triggerEvent(LuaEventManager.java:248) at zombie.core.Core.ResetLua(Core.java:4207) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at se.krka.kahlua.integration.expose.caller.MethodCaller.call(MethodCaller.java:58) at se.krka.kahlua.integration.expose.LuaJavaInvoker.call(LuaJavaInvoker.java:194) at se.krka.kahlua.integration.expose.MultiLuaJavaInvoker.call(MultiLuaJavaInvoker.java:59) at se.krka.kahlua.vm.KahluaThread.callJava(KahluaThread.java:178) at se.krka.kahlua.vm.KahluaThread.luaMainloop(KahluaThread.java:795) at se.krka.kahlua.vm.KahluaThread.call(KahluaThread.java:162) at se.krka.kahlua.vm.KahluaThread.pcall(KahluaThread.java:1740) at se.krka.kahlua.vm.KahluaThread.pcallBoolean(KahluaThread.java:1676) at se.krka.kahlua.integration.LuaCaller.protectedCallBoolean(LuaCaller.java:96) at zombie.ui.UIElement.onMouseUp(UIElement.java:1411) at zombie.ui.UIElement.onMouseUp(UIElement.java:1384) at zombie.ui.UIElement.onMouseUp(UIElement.java:1384) at zombie.ui.UIElement.onConsumeMouseButtonUp(UIElement.java:1474) at zombie.ui.UIManager.updateMouseButtons(UIManager.java:747) at zombie.ui.UIManager.update(UIManager.java:621) at zombie.GameWindow.logic(GameWindow.java:347) at zombie.GameWindow.frameStep(GameWindow.java:790) at zombie.GameWindow.mainThreadStep(GameWindow.java:567) at zombie.MainThread.mainLoop(MainThread.java:69) at java.base/java.lang.Thread.run(Unknown Source) ``` ```

AI 解决方案

🔍 报错分析

1. 🌐 错误翻译

原文:java.util.UnknownFormatConversionException: Conversion = ')'
译文:java.util.UnknownFormatConversionException: 格式转换错误,转换符为 ')'

原文:java.lang.RuntimeException: Object tried to call nil in getConfig
译文:java.lang.RuntimeException: 对象尝试在 getConfig 中调用 nil 值

2. 🎯 原因分析

这两个错误均发生在 CleanUI 模组的 Lua 脚本中,具体位置在 CleanUIConfig.lua 文件的第 410 行 getConfig 函数调用过程中:

  • 格式转换错误:Java 的 String.format() 方法使用了无效的格式转换符 ),导致抛出 UnknownFormatConversionException,这是由于 Lua 传递给 Java 层的字符串格式不符合规范。
  • 调用 nil 值错误:Lua 脚本尝试调用一个值为 nil 的对象,导致运行时异常,表明在 getConfig 函数中存在未正确初始化或赋值的变量被作为函数或对象使用。

3. 💡 解决方案

需要检查并修复 CleanUIConfig.lua 第 410 行附近的代码,确保传递给 Java 层的字符串格式正确,且所有调用的对象均已正确初始化。以下是常见的修复方向:

-- 修复前示例(可能存在的问题)
-- local config = getConfig()  -- 可能返回 nil
-- 传递格式错误的字符串给 Java
-- local formattedStr = string.format("Some invalid format: %)", value)

-- 修复后示例
local config = getConfig()
if config == nil then
    error("getConfig() returned nil, check initialization!")
end

-- 确保传递给 Java 的字符串格式正确,避免使用非法转换符
local formattedStr = string.format("Valid format: %s", value)
-- 调用 config 前确保其非 nil
config:someMethod()

具体操作步骤

  • 定位到 CleanUIConfig.lua 第 410 行,检查 getConfig() 函数的返回值是否存在为 nil 的情况,若存在则添加判空处理。

  • 检查该行及周边调用 Java 方法时传递的字符串格式,确保使用的格式转换符符合 Java 规范(如 %s%d 等),移除非法的 ) 等无效转换符。
  • 4. 🛡️ 预防措施

    • 严格判空处理:在 Lua 中调用可能返回 nil 的函数或变量后,立即进行非空校验,避免对 nil 进行函数调用或方法调用。

    • 规范字符串格式:使用 string.format 构造传递给 Java 的字符串时,严格遵循对应语言的格式规范,提前校验格式字符串的合法性。

    • 调试工具辅助:使用 Lua 调试工具(如 mobdebug)对 getConfig 函数的执行流程和返回值进行追踪,定位未初始化的变量;在开发阶段开启详细日志,捕获参数传递过程中的异常信息。