You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入式Groovy脚本变量使用:代码抛出异常问题排查

问题排查与修复

核心问题分析

代码抛出异常的原因有两个:

  1. 错误处理GString内容:你调用GStringImpl.getStrings()并拼接,这个方法仅返回GString里的固定字符串片段(比如"Hello, "和"!"),完全漏掉了插值的变量值(name对应的"world"),所以拼接后得到"Hello, !",和预期不符。
  2. 脚本字符串语法错误:scriptStr定义末尾多了一个分号,且字符串未正确闭合(原代码缺少收尾的双引号)。

修复方案

方案1:直接转换GString为String(推荐)

无需手动解析GString结构,Groovy的GString可以直接转为String,自动完成插值拼接:

final String scriptStr = "return \"Hello, $name!\";";
final GroovyShell gs = new GroovyShell();
final Script script = gs.parse(new StringReader(scriptStr));

final Binding binding = new Binding();
binding.setProperty("name", "world");
script.setBinding(binding);

// 直接将运行结果转为String,自动处理插值
final String result = script.run().toString();

if (!"Hello, world!".equals(result)) {
    throw new IllegalStateException("Unexpected result: " + result);
}
System.out.println("Okay.");

方案2:手动解析GString结构(不推荐,无必要)

如果一定要手动拆解GString,需要同时结合getStrings()和getValues(),交替拼接固定片段与变量值:

final String scriptStr = "return \"Hello, $name!\";";
final GroovyShell gs = new GroovyShell();
final Script script = gs.parse(new StringReader(scriptStr));

final Binding binding = new Binding();
binding.setProperty("name", "world");
script.setBinding(binding);

final GStringImpl gsi = (GStringImpl) script.run();
final String[] gsArray = gsi.getStrings();
final Object[] values = gsi.getValues();
final StringBuilder result = new StringBuilder();

// 交替拼接固定字符串和变量值
for (int i = 0; i < gsArray.length; i++) {
    result.append(gsArray[i]);
    if (i < values.length) {
        result.append(values[i]);
    }
}

if (!"Hello, world!".equals(result.toString())) {
    throw new IllegalStateException("Unexpected result: " + result);
}
System.out.println("Okay.");

关键说明

  • Groovy的GString是带插值逻辑的特殊字符串类型,直接调用toString()就能得到完整的插值后结果,无需手动拆解。
  • 必须修正scriptStr的语法错误,否则脚本会解析失败。

内容的提问来源于stack exchange,提问作者JochenW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:29:49