Conversion = ')' at java.base/java.util.Formatter.parse(Unknown Source) at java....

2026年08月26日 21:18 36.17 秒 success

错误信息

``` === Zomboid Settings === Version: 42.20.4 b0bbce05d5 (Steam) Mode: SINGLE PLAYER [x1] Lua(Vanilla).addModOptionsPanel(MainOptions.lua:2817) Lua(Vanilla).create(MainOptions.lua:410) Lua(Vanilla).instantiate(MainScreen.lua:694) Lua(Vanilla).addToUIManager(ISUIElement.lua:1367) Lua(Vanilla).LoadMainScreenPanelInt(MainScreen.lua:1791) Lua(Vanilla).LoadMainScreenPanel(MainScreen.lua:1686) 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.gameStates.MainScreenState.enter(MainScreenState.java:444) at zombie.gameStates.GameStateMachine.update(GameStateMachine.java:90) at zombie.GameWindow.logic(GameWindow.java:390) 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:转换符号 = ')'

2. 🎯 原因分析


  • 根本原因:代码中使用 String.format() 方法时,格式字符串中包含了非法的格式转换符 ),该符号并非有效的格式说明符,导致格式化解析失败。

  • 错误位置:从堆栈看,问题出现在 zombie.debug.DebugLogStream.printException 方法中,该方法调用 String.format() 时传入了错误的格式字符串,而这个错误格式源于 Lua 层调用 Java 接口(LuaManager$GlobalObject.getText)时传递的文本内容存在格式问题。
  • 3. 💡 解决方案


    由于错误源于 Lua 传递的文本内容,需要在 Lua 代码中修复格式字符串,确保传递给 Java 的文本不包含非法格式符。
    Lua 修复示例(假设问题出在格式字符串拼接):
    -- 错误示例:格式字符串包含非法的 ')'
    -- local text = string.format("剩余资源: %d%),状态: %s", resources, status)
    
    -- 修复后:移除非法格式符,调整格式字符串
    local text = string.format("剩余资源: %d,状态: %s", resources, status)
    -- 传递text给Java接口
    LuaManager.GlobalObject.setText(text)
    

    若无法定位具体Lua代码,检查以下位置

  • MainOptions.lua:2817 或附近调用 addModOptionsPanel 的代码,排查文本参数中的格式字符串拼接。

  • 检查 Lua 中向 Java 传递文本时,是否存在误将括号 ) 作为格式符号拼接的情况。
  • 4. 🛡️ 预防措施


  • 🔧 在拼接格式字符串时,严格对照 Java 格式说明符规范(如 %d%s 等),避免使用非法符号(如 )% 缺失匹配等),可使用 IDE 的字符串格式化校验插件。

  • 🔍 对于 Lua 与 Java 的交互,建议增加参数类型检查和格式预校验,在传递前用 string.gsub 清理可能的非法格式符号,例如:

  • -- 清理格式字符串中的非法转换符
    local cleanText = text:gsub("%%%)", "%%%%")  -- 若存在)作为非法格式符,替换为转义