MacOS Ventura下VS Code运行Java程序出现JNI错误求助
解决MacOS Ventura下VS Code运行Java程序出现JNI错误(Error decoding percent encoded characters)
问题背景
- 环境:2018款MacBook Pro(Ventura系统)、Oracle JDK 19.0.1、VS Code + Java Extension Pack
- 症状:所有Java程序(包括简单的HelloWorld)运行时抛出JNI错误,错误栈核心为
java.lang.IllegalArgumentException: Error decoding percent encoded characters;已确认javac和java版本均为19.0.1,删除旧的Eclipse Temurin JDK后问题仍存在
错误栈详情:
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.IllegalArgumentException: Error decoding percent encoded characters at java.base/sun.net.www.ParseUtil.decode(ParseUtil.java:218) at java.base/jdk.internal.loader.FileURLMapper.getPath(FileURLMapper.java:64) at java.base/jdk.internal.loader.FileURLMapper.exists(FileURLMapper.java:73) at java.base/jdk.internal.loader.URLClassPath$JarLoader.getJarFile(URLClassPath.java:826) at java.base/jdk.internal.loader.URLClassPath$JarLoader$1.run(URLClassPath.java:771) at java.base/jdk.internal.loader.URLClassPath$JarLoader$1.run(URLClassPath.java:765) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.base/jdk.internal.loader.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:764) at java.base/jdk.internal.loader.URLClassPath$JarLoader.<init>(URLClassPath.java:738) at java.base/jdk.internal.loader.URLClassPath$3.run(URLClassPath.java:502) at java.base/jdk.internal.loader.URLClassPath$3.run(URLClassPath.java:485) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.base/jdk.internal.loader.URLClassPath.getLoader(URLClassPath.java:484) at java.base/jdk.internal.loader.URLClassPath.getLoader(URLClassPath.java:452) at java.base/jdk.internal.loader.URLClassPath.getResource(URLClassPath.java:321) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:757) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:495) at java.base/java.lang.Class.forName(Class.java:474) at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:790) at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:685)
解决方案
1. 检查并修正项目路径
该错误90%以上是因为项目或文件路径包含空格、非ASCII字符(如德语变音符号、中文等),Java类加载器解析URL编码时失败:
- 确认Java文件所在目录路径是否存在特殊字符(例如
~/Documents/Java Kurs/或带ä/ö/ü的路径) - 将项目迁移到纯英文、无空格的路径下(如
~/Documents/JavaProjects/),重新运行程序
2. 彻底清理旧JDK残留
即使删除了Temurin JDK,系统可能仍有残留配置:
- 查看系统已安装的JDK列表:
/usr/libexec/java_home -V - 如果输出显示仍有其他JDK,手动删除对应目录:
sudo rm -rf /Library/Java/JavaVirtualMachines/[旧JDK文件夹名] - 打开VS Code设置(
Cmd+,),搜索java.home,确认路径指向/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home,若有其他路径则修改或清空,让VS Code自动检测
3. 重置VS Code Java插件缓存
插件缓存异常可能导致运行逻辑出错:
- 关闭VS Code,执行以下命令删除缓存:
rm -rf ~/.vscode/extensions/redhat.java-*/language-server rm -rf ~/.cache/jdt-language-server - 重新打开VS Code,等待Java Extension Pack完成初始化
4. 终端手动运行排查插件问题
排除VS Code插件干扰,直接在终端编译运行:
- 进入Java文件所在目录,执行:
javac HelloWorld.java java HelloWorld- 若终端运行正常,说明问题出在VS Code插件配置,可尝试重装Java Extension Pack
- 若终端也报错,确认路径无特殊字符后,重新安装JDK 19.0.1
5. 验证JAVA_HOME配置有效性
确保Zsh环境变量配置正确:
- 打开
~/.zshenv,添加或修改为:export JAVA_HOME=$(/usr/libexec/java_home -v 19.0.1) export PATH=$JAVA_HOME/bin:$PATH - 执行
source ~/.zshenv生效,再运行echo $PATH,确认/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home/bin位于PATH最前端,避免系统优先调用其他JDK
内容的提问来源于stack exchange,提问作者kjk10
相关产品推荐
相关产品推荐

