我一直在尝试下面的代码
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptCode {
public static void main(String[] args) throws Exception{
String code="";
int y=-1;
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
code="if(a<b){return b;}else{return a;}";
engine.put("a",10);
engine.put("b",100);
y=(int)engine.eval(code);
System.out.println(y);
}
}我收到一个错误,说
Caused by: jdk.nashorn.internal.runtime.ParserException: <eval>:1:8 Invalid return statement
if(a<b){return b;}else{return a;}我无法解决此问题。问题是,在我的用例中,'code‘变量将有一些规则,这将返回一些东西。我知道如何在不返回的情况下做到这一点,但我无法从代码中返回一些值。我该怎么做呢?
发布于 2020-03-10 14:49:58
您应该先声明一个函数,然后执行它,才能获得结果
engine.eval("function max(a,b) { if(a<b){return b;} return a;}");
engine.put("a",10);
engine.put("b",100);
int y = (int)engine.eval("max(a,b)"); // will return function result或者将结果赋给一个变量,然后读取它
engine.put("a",10);
engine.put("b",100);
engine.eval("c= a<b? b: a;"); // assign result to a variable
int y = (int) engine.get("c"); // read the value您有一个错误,因为您的return语句不在任何函数中,因此return将无效。eval类似于任何浏览器中的开发人员工具控制台。您需要声明一个函数或一个变量。
发布于 2020-03-10 14:48:29
根据this问题,你需要在最后一行写下你想要返回的值,而不是return关键字。您的示例将如下所示(使用帮助变量max)
String code="";
int y=-1;
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
code="if(a<b){" +
"max = b" +
"}else{" +
"max = a" +
"} " +
"max";
engine.put("a",10);
engine.put("b",100);
y=(int)engine.eval(code);
System.out.println(y);发布于 2020-03-10 14:50:27
如果不在函数中,就不能返回,这很容易解决;您可以定义一个JavaScript函数并从Java中调用它。喜欢,
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String code = "function f(a,b) { if(a<b){return b;}else{return a;}}";
engine.eval(code);
Invocable invocable = (Invocable) engine;
int y = (int) invocable.invokeFunction("f", 10, 100);
System.out.println(y);输出
100https://stackoverflow.com/questions/60612569
复制相似问题