使用LWJGL 2创建Display时出现sun.misc.Unsafe找不到错误求助
问题:LWJGL 2创建Display组件时抛出NoClassDefFoundError
错误日志:
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.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:304) at java.base/java.lang.Class.newInstance(Class.java:685) at lwjgl/org.lwjgl.MemoryUtil.loadAccessor(MemoryUtil.java:375) at lwjgl/org.lwjgl.MemoryUtil.<clinit>(MemoryUtil.java:63) at lwjgl/org.lwjgl.opengl.WindowsDisplay.setTitle(WindowsDisplay.java:523) at lwjgl/org.lwjgl.opengl.Display.setTitle(Display.java:541) at lwjgl/org.lwjgl.opengl.Display.createWindow(Display.java:312) at lwjgl/org.lwjgl.opengl.Display.create(Display.java:848) at lwjgl/org.lwjgl.opengl.Display.create(Display.java:797) at The_Last_Survivor/com.tls.engines.Render.display.create(display.java:26) at The_Last_Survivor/com.tls.engines.Start.Main.main(Main.java:11) Caused by: java.lang.ClassNotFoundException: sun.misc.Unsafe at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 16 more
我编写的display类代码:
package com.tls.engines.Render; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.ContextAttribs; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.PixelFormat; public class display { private static final int WIDTH = 1280; private static final int HEIGHT = 720; private static final int FPS_cap = 30; // TO-DO: Make a settings menu that changes this and remove final public static void create() { ContextAttribs attribs = new ContextAttribs(3,2); attribs.withForwardCompatible(true); attribs.withProfileCore(true); try { Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT)); Display.create(new PixelFormat(), attribs); } catch (LWJGLException e) { e.printStackTrace(); } GL11.glViewport(0, 0, WIDTH, HEIGHT); } public static void update() { Display.sync(FPS_cap); display.update(); } public static void close() { Display.destroy(); } }
调用逻辑的Starter类代码:
package com.tls.engines.Start; import org.lwjgl.opengl.Display; import com.tls.engines.Render.display; public class Starter { public static void main(String[] args) { display.create(); while(!Display.isCloseRequested()) { //TO-DO: Make game logic //TO-DO: Make renderer display.update(); } display.close(); } }
补充说明:已导入jinput、lwjgl_test、lwjgl_util、lwjgl、slick-util这些Jar包,使用LWJGL 2版本,此前移除lwjgl_debug解决了一个问题,但现在调用display.create()时触发上述错误。
原因与解决方案
错误原因
- 核心依赖问题:LWJGL 2底层依赖JDK内部非公开API
sun.misc.Unsafe,该类在JDK 9及以后版本中被官方移除并隐藏,无法直接访问。你当前使用的JDK版本应为JDK 9或更高,导致LWJGL 2加载失败。 - 代码逻辑问题:
display.update()方法内部递归调用自身,会导致无限递归,最终触发栈溢出错误。
解决方案
方案1:降级JDK到8版本
LWJGL 2是为JDK 8及更早版本设计的,降级后可完全兼容,无需额外配置,是最稳定的解决方式。
方案2:高版本JDK添加JVM参数兼容
若不想降级JDK,可在运行程序时添加以下JVM参数,允许访问sun.misc.Unsafe:
--add-exports java.base/sun.misc=ALL-UNNAMED
- IDE环境:在运行配置的「VM选项」中加入上述参数
- 命令行运行:在
java命令后追加参数,例如java --add-exports java.base/sun.misc=ALL-UNNAMED -jar your-game.jar
额外修复:解决update方法递归问题
修改display.update()方法,将递归调用替换为LWJGL的官方更新方法:
public static void update() { Display.sync(FPS_cap); Display.update(); // 替换原有的display.update() }
内容的提问来源于stack exchange,提问作者Potato
相关产品推荐
相关产品推荐

