s (2) --- [x2] Lua((MOD:CleanUI)).getConfig(CleanUIConfig.lua:410) java.util.Unk...
错误信息
```
=== 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 的情况,若存在则添加判空处理。%s、%d 等),移除非法的 ) 等无效转换符。4. 🛡️ 预防措施
- 严格判空处理:在 Lua 中调用可能返回
nil的函数或变量后,立即进行非空校验,避免对nil进行函数调用或方法调用。 - 规范字符串格式:使用
string.format构造传递给 Java 的字符串时,严格遵循对应语言的格式规范,提前校验格式字符串的合法性。 - 调试工具辅助:使用 Lua 调试工具(如
mobdebug)对getConfig函数的执行流程和返回值进行追踪,定位未初始化的变量;在开发阶段开启详细日志,捕获参数传递过程中的异常信息。