关于ON CHANGE中ACTIONS用法的问题及空指针异常排查
关于LSFusion中ON CHANGE INPUT ACTIONS的问题
问题场景
我尝试使用以下公式:
ON CHANGE { INPUT x = STRING LIST name(DimNomenkl s1) ACTIONS 'myaction' { MESSAGE 'current line : ' + x; } DO {....}}
遇到三个问题:
- 不添加
ACTIONS时,字段正常显示清除X按钮,但添加ACTIONS后该按钮消失。 - 想咨询
ACTIONS是否支持多个按钮,当前语法是否存在问题? - 同时出现了如下空指针异常:
java.lang.NullPointerException at java.base/java.util.regex.Matcher.getTextLength(Matcher.java:1770) at java.base/java.util.regex.Matcher.reset(Matcher.java:416) at java.base/java.util.regex.Matcher.<init>(Matcher.java:253) at java.base/java.util.regex.Pattern.matcher(Pattern.java:1134) at lsfusion.server.language.ScriptingLogicsModule.parseKeyStrokeOptions(ScriptingLogicsModule.java:2304) at lsfusion.server.language.ScriptingLogicsModule.lambda$7(ScriptingLogicsModule.java:2297) at lsfusion.base.col.implementations.simple.SingletonSet.mapListValues(SingletonSet.java:428) at lsfusion.server.language.ScriptingLogicsModule.getContextListEntity(ScriptingLogicsModule.java:2295) at lsfusion.server.language.ScriptingLogicsModule.addScriptedInputAProp(ScriptingLogicsModule.java:2362) at lsfusion.server.language.LsfLogicsParser.inputActionDefinitionBody(LsfLogicsParser.java:30917) at lsfusion.server.language.LsfLogicsParser.recursiveExtendContextActionDB(LsfLogicsParser.java:23854) at lsfusion.server.language.LsfLogicsParser.recursiveContextActionDB(LsfLogicsParser.java:23736) at lsfusion.server.language.LsfLogicsParser.actionDefinitionBody(LsfLogicsParser.java:23655) at lsfusion.server.language.LsfLogicsParser.keepContextFlowActionDefinitionBody(LsfLogicsParser.java:23335) at lsfusion.server.language.LsfLogicsParser.listActionDefinitionBody(LsfLogicsParser.java:31831) at lsfusion.server.language.LsfLogicsParser.listTopContextDependentActionDefinitionBody(LsfLogicsParser.java:23159) at lsfusion.server.language.LsfLogicsParser.formActionDeclaration(LsfLogicsParser.java:9686) at lsfusion.server.language.LsfLogicsParser.formActionObject(LsfLogicsParser.java:7704) at lsfusion.server.language.LsfLogicsParser.formPropertyOptionsList(LsfLogicsParser.java:6598) at lsfusion.server.language.LsfLogicsParser.formMappedPropertiesList(LsfLogicsParser.java:7396) at lsfusion.server.language.LsfLogicsParser.formPropertiesList(LsfLogicsParser.java:5981) at lsfusion.server.language.LsfLogicsParser.formStatement(LsfLogicsParser.java:1750) at lsfusion.server.language.LsfLogicsParser.statement(LsfLogicsParser.java:997) at lsfusion.server.language.LsfLogicsParser.statements(LsfLogicsParser.java:705) at lsfusion.server.language.LsfLogicsParser.script(LsfLogicsParser.java:659) at lsfusion.server.language.ScriptParser.initParseStep(ScriptParser.java:61) at lsfusion.server.language.ScriptingLogicsModule.parseStep(ScriptingLogicsModule.java:5284) at lsfusion.server.language.ScriptingLogicsModule.initMainLogic(ScriptingLogicsModule.java:244) at lsfusion.server.logics.controller.init.InitMainLogicTask.runInnerTask(InitMainLogicTask.java:28) at lsfusion.server.language.ScriptingLogicsModule.runInit(ScriptingLogicsModule.java:303) at lsfusion.server.physics.dev.module.controller.init.GroupModuleTask.runTask(GroupModuleTask.java:20) at lsfusion.server.physics.dev.module.controller.init.GroupModuleTask.runTask(GroupModuleTask.java:1) at lsfusion.server.base.task.GroupSingleTask$1.run(GroupSingleTask.java:67) at lsfusion.server.base.task.Task.proceed(Task.java:154) at lsfusion.server.base.task.Task$1.aspectRun(Task.java:112) at lsfusion.server.base.controller.thread.ExecutorFactory$AspectRunnable.run(ExecutorFactory.java:475) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) at lsfusion.server.base.controller.thread.ExecutorFactory$ClosableDaemonThreadFactory$ClosableThread.run(ExecutorFactory.java:554)
问题解答
1. 清除按钮消失的处理
添加ACTIONS后默认清除按钮会被覆盖,LSFusion会认为你要自定义输入框操作按钮。要保留清除按钮,需手动添加内置的清除动作,示例:
ACTIONS 'myaction' { MESSAGE 'current line : ' + x; }, CLEAR { }
2. 多按钮支持与语法修正
ACTIONS支持多个按钮,语法上需用逗号分隔不同动作定义。你的原始语法缺少动作分隔,这也是导致空指针异常的核心原因——解析器无法正确识别动作结构。修正后的完整示例:
ON CHANGE { INPUT x = STRING LIST name(DimNomenkl s1) ACTIONS 'myaction' { MESSAGE 'current line : ' + x; }, 'secondAction' { MESSAGE 'second action triggered'; }, CLEAR { } // 保留清除按钮 DO { .... } }
3. 空指针异常的解决
空指针发生在正则解析步骤,是因为原始语法不符合LSFusion的解析规则。按照上述修正后的格式,确保动作间用逗号分隔、每个动作的名称和逻辑块格式正确,即可避免解析错误引发的空指针。
内容的提问来源于stack exchange,提问作者BumpMen
相关产品推荐
相关产品推荐

