2015-01-05 7 views
1

Я новичок в Java, и это моя первая программа, за исключением 15 линейных печатных классов. Каждый раз, когда я пытаюсь скомпилировать свой GameTutorial.java, он получает исключение NullPointerException для строки 57 (внутри метода update()). Пожалуйста, мне нужна помощь, потому что я не знаю, что я делаю неправильно. Возможно, это InputHandler.class, поэтому я тоже написал его.Java NullPointerException on KeyEvent

GameTutorial:

import input.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.Graphics; 
import java.awt.Color; 
import javax.swing.JFrame; 
import java.awt.image.BufferedImage; 

public class GameTutorial extends JFrame{ 

InputHandler input; 

public static void main(String[] args){ 
    GameTutorial game = new GameTutorial(); 
    game.run(); 
    System.exit(0); 
}; 

static int x=10; 
static int windowHeight=600; 
static int windowWidth=1200; 
static BufferedImage backBuffer = new BufferedImage(windowWidth, windowHeight, BufferedImage.TYPE_INT_RGB); 

public void run(){ 
    boolean isRunning = true; 

    initialize(); 

    while(isRunning){ 
     long time = System.currentTimeMillis(); 

     update(); 
     draw(); 

     time = (1000/30) - (System.currentTimeMillis() - time); 

     if (time > 0) { 
      try{ 
       Thread.sleep(time); 
      } 
       catch(Exception e){}; 
     }; 
    }; 

    setVisible(false); 

}; 

public void initialize(){ 
    setTitle("Game Tutorial"); 
    setSize(windowWidth, windowHeight); 
    setResizable(false); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setVisible(true); 
}; 

public void update(){ 
    if (input.isKeyDown(KeyEvent.VK_RIGHT)){ 
     x += 5; 
    } 

    if (input.isKeyDown(KeyEvent.VK_LEFT)){ 
     x -= 5; 
    } 
}; 

public void draw(){ 
    Color white = Color.WHITE; 
    Color black = Color.BLACK; 

    Graphics g = getGraphics(); 

    Graphics bbg = backBuffer.getGraphics(); 

    bbg.setColor(Color.WHITE); 
    bbg.fillRect(0, 0, windowWidth, windowHeight); 

    bbg.setColor(Color.BLACK); 
    bbg.drawOval(x, 100, 20, 20); 

    g.drawImage(backBuffer, 0, 0, this); 
}; 

}

InputHandler:

package input; 

import java.awt.Component; 
import java.awt.event.*; 

public class InputHandler implements KeyListener{ 

static boolean[] keys = new boolean[256]; 

public InputHandler(Component c){ 
    c.addKeyListener(this); 
} 

public boolean isKeyDown(int keyCode){ 
    if (keyCode > 0 && keyCode < 256){ 
     keys[keyCode]=true; 
     return keys[keyCode]; 
    } 

    return false; 
} 

public void keyPressed(KeyEvent e){ 
    if (e.getKeyCode() > 0 && e.getKeyCode() < 256){ 
     keys[e.getKeyCode()] = true; 
    } 
} 

public void keyReleased(KeyEvent e){ 
    if (e.getKeyCode() > 0 && e.getKeyCode() < 256){ 
     keys[e.getKeyCode()] = false; 
    }   
} 

public void keyTyped(KeyEvent e){} 
} 
+1

Использование API привязки ключевых слов к KeyListener и сохранить ваши проблемы, связанные с проблемами фокуса, и KeyListeners – MadProgrammer

+0

Какой учебник по учебному курсу вы используете? –

+0

Этот: http://compsci.ca/v3/viewtopic.php?t=25991 – gabzerbinato

ответ

1

Ваш вход поле никогда не получает значение, прежде чем была использована. Вы должны инициализировать его, прежде чем использовать его методы.

Что-то вроде:

input = new InputHandler(whatever); 

Надеется, что это помогает

Редактировать

От вашего кода, вероятно, будет достаточно заменить объявление поля с декларацией поля и initilaization как это:

InputHandler input = new InputHandler(this); 
+0

Спасибо! Я действительно не знал, что происходит, ты просто мне очень помог! – gabzerbinato

0

Вы не присвоить значение входного InputHandler.

input=new InputHandler(argument);