JavaScript Scripting System throws NullPointerException for Java

I want to consume content script using JavaScript for my Java application and am facing some problems with my script system. The system is supposed to load a series of scripts to be executed in Java, however, when I try to load the scripts, I get the following errors:

Exception in thread "main" sample-plugin.js is loaded?
java.lang.NullPointerException
    at com.javascript.ScriptHandler.loadScript(ScriptHandler.java:47)
    at com.javascript.ScriptHandler.loadScriptsFromDirectory(ScriptHandler.java:33)
    at com.javascript.Main.main(Main.java:8)

      

Main.java

package com.javascript;

public class Main {

    private static ScriptHandler scriptHandler = new ScriptHandler();

    public static void main(String[] args) {
        scriptHandler.loadScriptsFromDirectory("./data/scripts/");
    }

}

      

ScriptHandler.java

package com.javascript;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class ScriptHandler {

    private static ScriptEngineManager scriptManager;
    private static ScriptEngine scriptEngine;

    public ScriptHandler() {
        scriptManager = new ScriptEngineManager();
        scriptEngine = scriptManager.getEngineByName("nashorn-javascript");
    }

    public void loadScriptsFromDirectory(String directory) {
        ArrayList<String> pathCollection = new ArrayList<String>();
        String[] path = { "skill", "player" };

        for (String i : path) {
            pathCollection.add(directory + i + "/");
        }

        for (int i = 0; i < pathCollection.size(); i++) {
            loadScript(pathCollection.get(i));
        }
    }

    private final void loadScript(String directory) {
        File file = new File(directory);

        if (file.exists() && file.isDirectory()) {
            File[] children = file.listFiles();

            for (File child : children) {
                if (child.isFile() && child.getName().endsWith(".js")) {
                    try {
                        System.out.println(child.getName() + " is loaded?");
                        scriptEngine.eval(new InputStreamReader(new FileInputStream(child)));
                    } catch (FileNotFoundException | ScriptException exception) {
                        exception.printStackTrace();
                    }
                } else if (child.isDirectory()) {
                    loadScriptsFromDirectory("./data/scripts/");
                }
            }
        }
    }

    public void executeScriptFunction(String function, Object... objects) {
        Invocable invocable = (Invocable) scriptEngine;

        try {
            invocable.invokeFunction(function, objects);
        } catch (NoSuchMethodException | ScriptException exception) {
            exception.printStackTrace();
        }
    }
}

      

fetch plugin.js

var plugin = function() {
    print("Hello from JavaScript")
}

      

+3


source to share


1 answer


As per this example , the machine name nashorn is simple nashorn

, not nashorn-javascript

.



+2


source







All Articles