Search code examples
java-8nashorn

Not getting result when ran the Nashorn program


I am new to Nashorn, I am trying to write one program and try to ran that program but i am getting the result after ran the program.Please find my code is below.

    package com.nashron;

    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;

    public class InvokScriptObjectMethod {
    public static void main(String[] args){
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");
        try {
            engine.eval(new FileReader("src/script/Script.js"));

        } catch (ScriptException | FileNotFoundException  ex) {

        }
    }

}

JS:

var Script = Java.type("com.nashron.Script");
var var1 = new Script("who am i");
return var1.get("I am Amar");

Java :

  package com.nashron;

public class Script {

    public Script() {

    }

    public Script(String arg1) {
        this.var1 = arg1;
        System.out.println("this is contructor");
    }

    private String var1;

    public String get(String arg1) {
        System.out.println("this is return statement");
        return this.var1 + arg1;
    }

}

here I want to get the return value.

Thanks in Advance


Solution

  • A top level script cannot have "return" statements. This is as per ECMAScript specification. Your program will result in ScriptException being thrown - as there is a return statement in your JS code (at top level). If you just remove return, the last evaluated expression is returned from engine.eval call.

    Example:

    File: Main.java

    import javax.script.*;
    import java.io.*;
    
    public class Main {
       public static void main(String[] args) throws Exception {
           ScriptEngineManager m = new ScriptEngineManager();
           ScriptEngine e = m.getEngineByName("nashorn");
    
           Object val = e.eval(new FileReader("x.js"));
           System.out.println(val);
       }
    }
    

    File: x.js

    java.lang.System.getProperty("os.name");