2014-10-24 3 views
0

Я продолжаю получать NullExceptionError, но я не знаю почему. Я знаю, что такая ошибка возникает, когда я ссылаюсь на объект, который еще не был инициализирован. В этой ситуации ошибка, по-видимому, возникает во второй последней строке второго файла (я прокомментировал это), но я уверен, что я инициализировал все в этой строке. Поэтому я не знаю, что мне нужно сделать, чтобы исправить Ошибка.Зачем мне это NullExceptionError?

Кстати, файлы скомпилированы просто отлично, ошибка появляется только при нажатии кнопки со стрелкой влево.

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); 
} 

} 
+1

Где вы инициализировали 'snakeGame'? –

+0

И это не компилятор, который дает вам «NullPointerException», это среда выполнения. –

+1

Возможно, вы должны использовать 'draw = new Draw (this)' –

ответ

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

Используя те делает вашу жизнь в качестве программиста проще и увеличивает ваши шансы получить помощь от других, поскольку они с большей вероятностью понимают ваш код.

+0

IMO, «DrawPanel» по-прежнему звучит verb-y: Это звучит как хорошее имя для метода, который рисует панель. Я бы пошел на «GamePanel» или «GameBoard» или «SnakePit» или ... –

+0

@jameslarge, вы правы, это может сбить с толку, хотя случай может иметь значение здесь: «DrawPanel» может означать панель для рисования на «drawPanel» означает действие рисования панели. ИМХО в терминах соглашений об именах «DrawPanel» будет в порядке (и я предложил для минимальной корректировки), но ваши предложения были бы более уместными. На самом деле «DrawPanel» может быть слишком общим именем. – Thomas

1

Вы никогда не инициализировали snakeGame; поэтому snakeGame == null. Вы должны инициализировать его в своем конструкторе по умолчанию, например SnakeGame snakeGame = new SnakeGame()

Мне также интересно, почему SnakeGame и Draw оба имеют друг друга в качестве частных членов.

Смежные вопросы