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

使用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()时触发上述错误。


原因与解决方案

错误原因

  1. 核心依赖问题:LWJGL 2底层依赖JDK内部非公开API sun.misc.Unsafe,该类在JDK 9及以后版本中被官方移除并隐藏,无法直接访问。你当前使用的JDK版本应为JDK 9或更高,导致LWJGL 2加载失败。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:14:55