mas*_*n69 3 javascript java java-7
这是我为 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) {
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的蝙蝠错误:
执行脚本时出错。路径:scripts/event/someEvent.js 异常 java.lang.NullPointerException:无法调用“javax.script.ScriptEngine.eval(java.io.Reader)”,因为“engine”为 null
每当我尝试与使用此方法的东西交互时(即单击 NPC 或在运行某些脚本时在服务器启动时),就会抛出这些错误。
发生这种NullPointerException情况是因为您使用的 Java 运行时没有安装“JavaScript”脚本引擎,导致sem.getEngineByName("JavaScript")返回null.
通过运行以下代码已验证这一点(请参阅注释):
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");
Run Code Online (Sandbox Code Playgroud)
当我在 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, JavaScript, javascript, ECMAScript, ecmascript]
Oracle jdk-9.0.4:
Oracle Nashorn 9.0.4 [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript]
OpenJDK jdk-11.0.2:
Oracle Nashorn 11.0.2 [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript]
AdoptOpenJDK jdk-14.0.2+12:
Oracle Nashorn 14.0.2 [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript]
AdoptOpenJDK jdk-15.0.1+9:
No Script Engines found
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,Java 7 的 OpenJDK 版本没有 JavaScript 引擎,因为 Mozilla Rhino 库不是开源的。您需要 Oracle 版本的 Java 7 才能获取 JavaScript 引擎。
您还可以看到 Java 15 中删除了 JavaScript,如JDK 15 发行说明中所述:
Nashorn JavaScript 脚本引擎、其 API 和
jjs工具已被删除。该引擎、API 和工具已在 Java 11 中弃用并删除,并明确打算在未来版本中删除它们。请参阅 JDK-8236933
| 归档时间: |
|
| 查看次数: |
16516 次 |
| 最近记录: |