You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:47:35