好吧,我正在为学校编写这个简单的JavaFX应用程序,在那里我们找到了从给定点开始迷宫的最短路径。然而,为了好玩,我决定更进一步,享受一些乐趣。我没有简单地对作为解决方案一部分的矩形进行着色,而是试图制作出一个从迷宫中走出来的pacman。奇怪的是,有时它可以完美地工作,有时它只是停止并在终端中发送此错误消息:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at javafx.scene.Scene$ScenePulseListener.synchronizeSceneNodes(Scene.java:2289)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2419)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
正如你所看到的那样,我的代码中没有指向错误的实际指针,所以我有点困惑,更不用说错误应该是什么了。
我在其中一个类中使用了一个线程来为pacman设置动画,但实际上正在更改Image
的代码位于Platform.runLater()
中,所以它不应该是造成任何问题。除此之外,我很遗憾,所以请给我一些问题指示,或帮我解释这个错误信息。
这是我用于动画的主题。只发布run方法和实例变量,但是walking
布尔值有一个简单的setter,并且有一个构造函数来设置Image
数组,帧。
实例变量:
boolean walking = false;
Image[] frames;
运行方法:
@Override
public void run() {
walking = true;
for(int i = 0; walking; i++) {
try {
Thread.sleep(200);
} catch(InterruptedException e) {
System.out.println(e);
}
final Image img = frames[i % frames.length];
Platform.runLater(new Runnable() {
@Override
public void run() {
setFill(new ImagePattern(img));
}
});
}
}
编辑:添加了线程代码