为什么我会得到这个Null异常错误?

时间:2014-10-24 15:49:22

标签: java nullpointerexception

我一直得到一个NullException错误,但我不知道为什么。我知道当我引用尚未初始化的对象时会发生这样的错误。在这种情况下,错误显然出现在第二个文件的第二行(我评论过那一行),但我很确定我已经初始化了该行中的所有内容..所以我不知道我该怎么做才能解决这个错误。

顺便说一句,文件编译得很好,只有当我按下左箭头按钮时才会出现错误。

public class SnakeGame {
JFrame frame;
Draw draw;
Timer timer;
int direction;

public static void main(String[] arg) {
    new SnakeGame();
}

SnakeGame() {
    draw = new Draw();

    frame = new JFrame("Snake");
    frame.add(draw, BorderLayout.CENTER);
    frame.setResizable(false);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.addKeyListener(draw);
    frame.requestFocusInWindow();
}

}

-

public class Draw extends JPanel implements ActionListener, KeyListener {
SnakeGame snakeGame;
public Draw(SnakeGame snakeGame) {
    this.snakeGame = snakeGame;
}

public Draw() {
    setPreferredSize(new Dimension(500,500));
    setBackground(Color.BLACK);
    setFocusable(true);
}

@Override
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if(key == KeyEvent.VK_LEFT){
        System.out.println("left pressed");
        setDirection(1);
    } else if (key == KeyEvent.VK_RIGHT) {
        System.out.println("right pressed");
    } else if (key == KeyEvent.VK_UP) {
        System.out.println("UP pressed");
    } else if (key == KeyEvent.VK_DOWN) {
        System.out.println("down pressed");
    }
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyTyped(KeyEvent e){
}

public int getDirection(){
   return snakeGame.direction;
}

public void setDirection(int dir){
    snakeGame.direction = dir;  //According to the compiler the error occurs here
    System.out.println(snakeGame.direction);
}

}

2 个答案:

答案 0 :(得分:2)

如果我看到它正确,初始化snakeGame的唯一方法就是调用Draw(SnakeGame snakeGame),据我所知,它永远不会被调用。

在您的SnakeGame构造函数中,您可以调用new Draw();,您可能希望将其更改为new Draw(this);。您还希望在另一个中的无参数构造函数Draw()中进行调用,例如setPreferredSize(new Dimension(500,500));等。

作为旁注:Draw看起来很像方法名称(这就是为什么我起初认为Draw()是一个制定者,而不是一个构造函数。你做了什么如果你将类名更改为类似DrawPanel等等,你的生活会更容易,即使用名词作为类名,动词或"命令"用于方法名称等。

有关基本命名约定,请参阅此维基百科文章:http://en.wikipedia.org/wiki/Naming_convention_%28programming%29

使用这些功能可以让您作为程序员的生活更轻松,并增加您获得其他人帮助的机会,因为他们更有可能理解您的代码。

答案 1 :(得分:1)

您从未初始化snakeGame;因此snakeGame == null。您需要在SnakeGame snakeGame = new SnakeGame()

之类的默认构造函数中初始化它

我也很好奇为什么SnakeGameDraw彼此都是私人成员。