使用Java Nashorn加载JS文件时触发NullPointerException求助
问题分析与解决
核心原因
你的代码中ScriptEngine ee = new ScriptEngineManager().getEngineByName("Nashorn")返回了null,导致调用ee.eval()时抛出空指针异常。这是因为JDK 11及更高版本(包括你使用的JDK 21)已经移除了内置的Nashorn JavaScript引擎,所以ScriptEngineManager找不到对应的引擎实例。
解决方案
方案1:切换到低版本JDK
如果不需要使用JDK21的新特性,可以将项目的JDK版本切换到JDK 8或JDK 10(这两个版本仍内置Nashorn引擎),无需修改代码即可正常运行。
方案2:在JDK21中手动引入Nashorn依赖
若坚持使用JDK21,需要添加独立的Nashorn库依赖:
- 如果使用Maven,在
pom.xml中添加:
<dependency> <groupId>org.openjdk.nashorn</groupId> <artifactId>nashorn-core</artifactId> <version>15.4</version> <!-- 使用最新稳定版本 --> </dependency>
- 如果使用Gradle,在
build.gradle中添加:
implementation 'org.openjdk.nashorn:nashorn-core:15.4'
添加依赖后,修改代码以正确加载引擎:
import javax.script.*; import java.io.*; import org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory; public class interpreter { public static void main(String[] args) throws Exception{ // 手动创建Nashorn引擎实例 ScriptEngine ee = new NashornScriptEngineFactory().getScriptEngine(); ee.eval(new FileReader("C:/Users/aryan/OneDrive/Documents/Github/prometheus-ide/src/holyc-interpreter.js")); } }
额外建议
避免硬编码文件绝对路径,可通过类加载器获取资源文件,提升代码可移植性:
// 从类路径中读取JS文件(需确保holyc-interpreter.js被打包到classpath中) InputStream is = interpreter.class.getResourceAsStream("/holyc-interpreter.js"); ee.eval(new InputStreamReader(is));
内容的提问来源于stack exchange,提问作者SpaciousCoder78
相关产品推荐
相关产品推荐

