Возвращаемое значение из scriptmanager в jdk8 - PullRequest
3 голосов
/ 10 марта 2020

Я пытаюсь использовать приведенный ниже код

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' будет иметь некоторые правила, которые будут возвращать что-то. Я знаю, как сделать это без возврата, но я не могу вернуть какое-то значение из кода. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 10 марта 2020

Вы должны объявить функцию, затем выполнить ее, чтобы получить результаты

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 похож на консоль инструментов разработчика в любом браузере. Вам нужно объявить либо функцию, либо переменную.

1 голос
/ 10 марта 2020

Вы не можете вернуться, не находясь внутри функции, достаточно легко решить; Вы можете определить функцию 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);

Выходы

100
1 голос
/ 10 марта 2020

в соответствии с этим вопросом вам нужно написать значение, которое вы хотите вернуть в последнюю строку, без ключевого слова 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);
...