微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法弄清楚为什么 ScriptEngine 引擎在代码中为空

如何解决无法弄清楚为什么 ScriptEngine 引擎在代码中为空

这是我为 MapleStory 服务器运行的一些代码。每当与 NPC 交谈等事件的脚本应该发生时,就会运行该脚本,为正在调用的任何脚本(NPC、传送门、事件等)创建脚本路径。

我也在用 jdk1.7.0_80

lang-java
package scripting;

import java.io.File; 
import java.io.FileReader; 
import java.io.IOException;
import javax.script.invocable; 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import client.MapleClient; 
import tools.FileoutputUtil;

public abstract class AbstractScriptManager {

    private static final ScriptEngineManager sem = new ScriptEngineManager(null);

    protected invocable getinvocable(String path,MapleClient c) {
        return getinvocable(path,c,false);
    }

    protected invocable getinvocable(String path,MapleClient c,boolean npc) {
        FileReader fr = null;
        try {
            path = "scripts/" + path;
            ScriptEngine engine = null;

            if (c != null) {
                engine = c.getScriptEngine(path);
            }
            if (engine == null) {
                File scriptFile = new File(path);
                if (!scriptFile.exists()) {
                    return null;
                }
                engine = sem.getEngineByName("JavaScript");
                if (c != null) {
                    c.setScriptEngine(path,engine);
                }
                fr = new FileReader(scriptFile);
                engine.eval(fr);
            } else if (c != null && npc) {
                c.getPlayer().dropMessage(-1,"You already are talking to this NPC. Use @ea if this is 
                not intended.");
            }
            return (invocable) engine;
        } catch (Exception e) {
            System.err.println("Error executing script. Path: " + path + "\nException " + e);
            FileoutputUtil.log(FileoutputUtil.ScriptEx_Log,"Error executing script. Path: " + path + 
            "\nException " + e);
            return null;
        } finally {
            try {
                if (fr != null) {
                    fr.close();
                }
            } catch (IOException ignore) {

            }
        }
    } 
}

这是我收到的蝙蝠错误

执行脚本时出错。路径:scripts/event/someEvent.js 异常 java.lang.NullPointerException:无法调用javax.script.ScriptEngine.eval(java.io.Reader)”因为“engine”为空

每当我尝试与使用此方法的事物进行交互时(即在运行某些脚本时单击 NPC 或服务器启动时),都会抛出这些错误

解决方法

出现 NullPointerException 是因为您使用的 Java 运行时没有安装“JavaScript”脚本引擎,导致 sem.getEngineByName("JavaScript") 返回 null

已通过运行以下代码验证(参见 comment):

ScriptEngineManager sem = new ScriptEngineManager();
List<ScriptEngineFactory> factories = sem.getEngineFactories();
for (ScriptEngineFactory factory : factories)
    System.out.println(factory.getEngineName() + " " + factory.getEngineVersion() + " " + factory.getNames());
if (factories.isEmpty())
    System.out.println("No Script Engines found");

当我在 Windows 10 上的各种 Java 实现上运行它时,我得到以下结果:

OpenJDK jdk1.7.0_75:
  No Script Engines found

Oracle jdk1.7.0_80:
  Mozilla Rhino 1.7 release 3 PRERELEASE [js,rhino,JavaScript,javascript,ECMAScript,ecmascript]

Oracle jdk1.8.0_181:
  Oracle Nashorn 1.8.0_181 [nashorn,Nashorn,js,JS,ecmascript]

Oracle jdk-9.0.4:
  Oracle Nashorn 9.0.4 [nashorn,ecmascript]

OpenJDK jdk-11.0.2:
  Oracle Nashorn 11.0.2 [nashorn,ecmascript]

AdoptOpenJDK jdk-14.0.2+12:
  Oracle Nashorn 14.0.2 [nashorn,ecmascript]

AdoptOpenJDK jdk-15.0.1+9:
  No Script Engines found

如您所见,Java 7 的 OpenJDK 版本没有 JavaScript 引擎,因为 Mozilla Rhino 库不是开源的。您需要 Java 7 的 Oracle 版本才能获得 JavaScript 引擎。

您还可以看到 JavaScript 在 Java 15 中被删除,如 JDK 15 Release Notes 中所述:

Nashorn JavaScript 脚本引擎、其 API 和 jjs 工具已被删除。引擎、API 和工具在 Java 11 中已被弃用,并明确打算在未来版本中删除它们。见JDK-8236933

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。