使用LWJGL加载声音时出现NoClassDefFoundError: sun/misc/Unsafe错误怎么办?
解决实例化Slick Sound时出现的
sun.misc.Unsafe找不到错误 这个问题的核心原因很明确:你使用的旧版Slick/LWJGL库和Java 9+版本不兼容。sun.misc.Unsafe是Java 8及之前版本中的内部API,Java 9开始它被从公开可用的API中移除了,而你的Slick库依赖这个类来处理音频资源,所以在实例化Sound对象时触发了NoClassDefFoundError。
下面是两种可行的解决方案:
方案一:降级到Java 8运行项目
旧版Slick和LWJGL是为Java 8及更早版本开发的,切换回Java 8就能直接解决这个兼容性问题。在Eclipse里可以这么操作:
- 右键你的项目 → Properties → Java Build Path → Libraries
- 找到「JRE System Library」,点击Edit,选择已安装的Java 8 JRE
- 打开Run Configurations,找到你的项目运行配置,在JRE选项卡中也设置为Java 8
方案二:升级到兼容高版本Java的库
如果不想降级Java,就需要更换为支持Java 9+的音频库版本:
- 推荐直接升级到LWJGL 3:它完全适配Java 9+,不再依赖
sun.misc.Unsafe,而且是Slick底层依赖的LWJGL的最新迭代版本 - 或者寻找Slick2D的现代分支:一些社区维护的Slick2D版本已经修复了高Java版本的兼容问题,可以替换你当前使用的旧Slick库
你的代码参考(方便定位问题)
package com.game; import java.util.HashMap; import java.util.Map; import org.newdawn.slick.Music; import org.newdawn.slick.Sound; public class AudioPlayer { public static Map<String, Sound> soundMap = new HashMap<String, Sound>(); public static Map<String, Music> musicMap = new HashMap<String, Music>(); public static void load() { try { soundMap.put("menu_sound", new Sound("Res/MouseClick.ogg")); // <- 抛出错误 musicMap.put("music", new Music("Res/Background.ogg")); } catch (Exception e) { e.printStackTrace(); } } public static Music getMusic(String key) { return musicMap.get(key); } public static Sound getSound(String key) { return soundMap.get(key); } }
错误堆栈信息
Exception in thread "main" java.lang.NoClassDefFoundError: sun/misc/Unsafe at lwjgl/org.lwjgl.MemoryUtilSun$AccessorUnsafe.getUnsafeInstance(MemoryUtilSun.java:74) at lwjgl/org.lwjgl.MemoryUtilSun$AccessorUnsafe.<init>(MemoryUtilSun.java:62) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:166) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:404) at java.base/java.lang.Class.newInstance(Class.java:590) at lwjgl/org.lwjgl.MemoryUtil.loadAccessor(MemoryUtil.java:324) at lwjgl/org.lwjgl.MemoryUtil.<clinit>(MemoryUtil.java:66) at lwjgl/org.lwjgl.openal.ALC10.alcOpenDevice(ALC10.java:202) at lwjgl/org.lwjgl.openal.AL.init(AL.java:160) at lwjgl/org.lwjgl.openal.AL.create(AL.java:138) at lwjgl/org.lwjgl.openal.AL.create(AL.java:102) at lwjgl/org.lwjgl.openal.AL.create(AL.java:201) at slick/org.newdawn.slick.openal.SoundStore$1.run(SoundStore.java:295) at java.base/java.security.AccessController.doPrivileged(AccessController.java:310) at slick/org.newdawn.slick.openal.SoundStore.init(SoundStore.java:292) at slick/org.newdawn.slick.Sound.<init>(Sound.java:54) at Wave/com.game.AudioPlayer.load(AudioPlayer.java:15) at Wave/com.game.Game.<init>(Game.java:37) at Wave/com.game.Game.main(Game.java:157) Caused by: java.lang.ClassNotFoundException: sun/misc/Unsafe at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 23 more
内容的提问来源于stack exchange,提问作者Shlok Sharma
相关产品推荐
相关产品推荐

