向空数组添加UUID时触发“参数数量错误”异常,求排查
问题
我有两个数组:parsedResultBD包含带name与uuid字段的账户列表,filteredStudyName为指定研究名称列表。需求是将parsedResultBD中name匹配filteredStudyName的uuid添加至空数组resultStudyUUIDCollector,代码能正常打印uuid,但添加时抛出java.lang.IllegalArgumentException: wrong number of arguments异常,相关代码与错误日志如下:
原代码块
def bdConverter = new JsonSlurper(); def responseBDTemp = prev.getResponseDataAsString(); def responseBD = bdConverter.parseText(responseBDTemp); def resultStudyUUIDCollector = []; def parsedResultBD = responseBD.accounts; def filteredStudyName = ["Inflammation","Perf","Test_Study"] parsedResultBD.each { entryVal -> for (tempValueOfStudy in filteredStudyName) { if (tempValueOfStudy == entryVal.name) { log.info('UUID : ' + entryVal.uuid); resultStudyUUIDCollector.add(entryVal.uuid as String); resultStudyUUIDCollector << entryVal.uuid; //tried with this also getting similar error } } } log.info(resultStudyUUIDCollector)
错误日志
2023-06-11 11:06:12,362 INFO o.a.j.e.J.StudyName_Processer: UUID : 17e9b276-081a-11ee-be56-0242ac120002 2023-06-11 11:06:12,363 INFO o.a.j.e.J.StudyName_Processer: UUID : 234d02b2-081a-11ee-be56-0242ac120002 2023-06-11 11:06:12,363 INFO o.a.j.e.J.StudyName_Processer: UUID : 2a2517be-081a-11ee-be56-0242ac120002 2023-06-11 11:06:12,363 ERROR o.a.j.e.JSR223PostProcessor: Problem in JSR223 script, StudyName_Processer javax.script.ScriptException: javax.script.ScriptException: java.lang.IllegalArgumentException: wrong number of arguments at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:158) ~[groovy-jsr223-3.0.11.jar:3.0.11] at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:231) ~[java.scripting:?] at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:219) ~[ApacheJMeter_core.jar:5.5] at org.apache.jmeter.extractor.JSR223PostProcessor.process(JSR223PostProcessor.java:45) ~[ApacheJMeter_components.jar:5.5] at org.apache.jmeter.threads.JMeterThread.runPostProcessors(JMeterThread.java:968) ~[ApacheJMeter_core.jar:5.5] at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:585) ~[ApacheJMeter_core.jar:5.5] at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) ~[ApacheJMeter_core.jar:5.5] at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) ~[ApacheJMeter_core.jar:5.5] at java.lang.Thread.run(Thread.java:833) ~[?:?]
问题原因与解决方法
原因分析
异常wrong number of arguments的核心原因是:直接用[]初始化数组时,在JMeter的JSR223环境中可能被上下文污染,创建出JMeter内部的Arguments对象而非Groovy原生列表。Arguments.add()方法需要传入键值对两个参数,但你只传了一个UUID,导致参数数量不匹配抛出异常。
另外代码中同时使用add()和<<两种方式添加元素,会造成UUID重复存储,属于冗余操作。
修复后的代码
明确创建Groovy原生ArrayList,同时简化匹配逻辑提升效率:
def bdConverter = new JsonSlurper(); def responseBDTemp = prev.getResponseDataAsString(); def responseBD = bdConverter.parseText(responseBDTemp); // 明确创建Groovy原生ArrayList,避免JMeter上下文干扰 def resultStudyUUIDCollector = new ArrayList<String>(); def parsedResultBD = responseBD.accounts; def filteredStudyName = ["Inflammation","Perf","Test_Study"] parsedResultBD.each { entryVal -> if (filteredStudyName.contains(entryVal.name)) { def uuidStr = entryVal.uuid as String log.info('UUID : ' + uuidStr); resultStudyUUIDCollector.add(uuidStr); } } log.info(resultStudyUUIDCollector)
额外优化点
- 用
filteredStudyName.contains(entryVal.name)替代嵌套循环,降低代码复杂度 - 只保留一种添加元素的方式,避免重复数据
- 提前将UUID转为String并赋值给变量,提升代码可读性
内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick
相关产品推荐
相关产品推荐

