我正在用Java开发一个学校项目的游戏。当我通过键入' java game'来运行我的代码时进入命令提示符,我得到一个空指针异常(在game.play,第35行," gameScreen.tick();"),但是当我在这一行添加断点并使用调试器时调查,调试器显示正确的对象引用并遵循程序没有任何问题。我似乎无法找出问题所在......
import javax.swing.*;
public class game implements Runnable {
private screen gameScreen;
public static void main(String[] args) {
// put your code here
game thisGame = new game();
SwingUtilities.invokeLater(thisGame);
thisGame.play();
}
public void run() {
JFrame w = new JFrame();
w.setDefaultCloseOperation(w.EXIT_ON_CLOSE);
gameScreen = new screen();
gameScreen = gameScreen.setUp();
w.add(gameScreen);
w.pack();
w.setLocationByPlatform(true);
w.setVisible(true);
}
public void play() {
while(true) {
try { Thread.sleep(10); }
catch (InterruptedException e) { }
}
gameScreen.tick();
}
}
任何帮助将不胜感激!感谢。
答案 0 :(得分:3)
invokeLater()
是一个异步调用,稍后会按名称建议调用它。
您的下一行会调用thisGame.play()
,然后在10毫秒后调用gameScreen.tick()
,此时可能未初始化。
调试器工作的原因是方法调用之间的等待时间可能足够长,以允许gameScreen
方法初始化run()
答案 1 :(得分:3)
Documentation给出了SwingUtilities.invokeLater方法的示例。
Runnable doHelloWorld = new Runnable() {
public void run() {
System.out.println("Hello World on " + Thread.currentThread());
}
};
SwingUtilities.invokeLater(doHelloWorld);
System.out.println("This might well be displayed before the other message.");
您可以在This might well be displayed before the other message.
之前看到Hello World on
可能会打印。
所以在你的情况下gameScreen = new screen();
可能不会在gameScreen.tick();
之前执行,所以你得到了NPE。
<强>解决方案:强>
您可以在default constructor
游戏类中初始化gameScreen。