javax.script.ScriptEngine 在运行时失败

2 投票
1 回答
1775 浏览
提问于 2025-04-15 18:37

有什么想法吗?

这是一个简单的Java程序:

public class Main {

public static void main(String[] args) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");
    engine.put("hello_str", "");
    engine.eval("for i in range(10):");
    engine.eval("   hello_str += str(i)");
    Object x = engine.get("hello_str");
    System.out.println("x: " + x);
}

}

但是它出现了一个错误:

在“main”线程中发生异常,错误信息是:javax.script.ScriptException: 语法错误:输入不匹配,期望缩进,在第1行第18列。

这个错误的详细信息是:

在org.python.jsr223.PyScriptEngine.scriptException(PyScriptEngine.java:170)中

在org.python.jsr223.PyScriptEngine.compileScript(PyScriptEngine.java:76)中

在org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:33)中

在javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)中

在javaapplication2.Main.main(Main.java:23)中

引起这个错误的原因是:文件“”,第1行

for i in range(10):

^

语法错误:输入不匹配,期望缩进。

1 个回答

2

看起来你在尝试执行一个不完整的语句,出现在以下代码行中:

engine.eval("for i in range(10):");
engine.eval("   hello_str += str(i)");

在这里,我假设 eval() 是在逐个执行这些语句,但在 for 后面找不到任何内容就出错了,因为这是一条不完整的语句。你可以试试这个:

engine.eval("for i in range(10):\n   hello_str += str(i)");

在这种情况下,换行符并不是必须的,但如果你想在循环体内包含多个语句,那就需要换行,比如:

engine.eval("for i in range(10):\n   hello_str += str(i)\n   print i");

另外要注意,上面例子中每个换行后的空格数量应该是相等的。实际上,我建议在执行之前先把整个脚本字符串组装好。更好的方法是从一个单独的 .py 文件中读取它。

撰写回答