【发布时间】:2019-08-28 18:49:54
【问题描述】:
我尝试使用 Java 运行一个简单的游戏,但在尝试运行此应用程序时不断出现错误。
线程“main”中的异常 java.lang.NoClassDefFoundError: sun/misc/Unsafe ...
我认为我的问题是我的 JDK (12.0.2) 不支持这些 Slick2D,因为它是“过时的”。如果降级我的 Java 版本是一种解决方案,有人可以解释我如何找到支持 Slick2D 的 Java 版本吗?
我已经在我的 IDE 中设置了我的库并设置了我的路径。我尝试在最新的 Intellij 和 eclipse 环境中运行相同的应用程序。我目前安装了 JDK 12.0.2 并安装了 2015 版的 LWJGL 和 Slick2D。
package classPackage;
import org.newdawn.slick.*;
public class Game extends BasicGame{
public Game(String gamename) {
super(gamename);
}
@Override
public void init(GameContainer gc) throws SlickException {
}
@Override
public void update(GameContainer gc, int i) throws SlickException {
}
@Override
public void render(GameContainer gc, Graphics g) throws SlickException {
g.drawString("Howdy!", 10, 10);
}
public static void main(String[] args) {
try {
AppGameContainer appgc;
appgc = new AppGameContainer(new Game("Simple Slick Game"));
appgc.setDisplayMode(640, 480, false);
appgc.start();
} catch (SlickException ex) {
}
}
}
错误:
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:375)
at lwjgl/org.lwjgl.MemoryUtil.<clinit>(MemoryUtil.java:63)
at lwjgl/org.lwjgl.opengl.WindowsDisplay.setTitle(WindowsDisplay.java:522)
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:757)
at slick/org.newdawn.slick.AppGameContainer.tryCreateDisplay(AppGameContainer.java:302)
at slick/org.newdawn.slick.AppGameContainer.access$000(AppGameContainer.java:34)
at slick/org.newdawn.slick.AppGameContainer$2.run(AppGameContainer.java:353)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:310)
at slick/org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:348)
at slick/org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
at testGame/classPackage.Game.main(Game.java:31)
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
【问题讨论】:
-
您可能会使用 Java 模块系统来构建和运行您的应用程序。在这种情况下,您必须在 module-info.java 中使用
requires jdk.unsupported;才能使用 sun.misc.Unsafe。或者您根本不使用 Java 模块系统(即模块路径)并使用经典类路径。在后一种情况下,它会正常工作。 -
昨晚我想出了自己的问题。事实证明,是的,我的 JDK 不支持该库。我将我的 JDK 降级到 8,现在它可以正常工作了。感谢您的输入
-
您不需要降级。 OpenJDK 12 或 Oracle JDK 12 确实支持 sun.misc.Unsafe。您只需要在您的 module-info.java 中要求它 OR 使用简单的
-classpath/-cp和 not 使用-p启动一个非模块化应用程序和-m。