空指针当程序未通过调试器运行时出现异常

时间:2015-04-20 12:20:00

标签: java oop debugging nullpointerexception

我正在用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();
    }
}

任何帮助将不胜感激!感谢。

2 个答案:

答案 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。