Исключение в потоке «Thread-2» java.lang.NullPointerException

1

Всякий раз, когда я запускаю свою программу, я получаю эту ошибку:

Exception in thread "Thread-2" java.lang.NullPointerException
    at ca.wamlab.game.entities.Player.tick(Player.java:20)
    at ca.wamlab.game.level.Level.tick(Level.java:38)
    at ca.wamlab.game.Game.tick(Game.java:169)
    at ca.wamlab.game.Game.run(Game.java:112)
    at java.lang.Thread.run(Thread.java:744)

Игнорируйте всех, кроме первого, потому что все они из-за этого.

Я получаю эту ошибку в следующем коде:

пакет ca.wamlab.game.entities;

import ca.wamlab.game.InputHandler;
import ca.wamlab.game.gfx.Colors;
import ca.wamlab.game.gfx.Screen;
import ca.wamlab.game.level.Level;

public class Player extends Mob{

private InputHandler input;
private int color = Colors.get(-1, 111, 145, 543);

public Player(Level level, int x, int y, InputHandler input) {
    super(level, "Player", x, y, 1);
}

    public void tick() {
        int xa = 0;
        int ya = 0;
        if(input.up.isPressed()){
            ya--;
        }
        if(input.down.isPressed()){
            ya++;
        }
        if(input.right.isPressed()){
            xa++;
        }
        if(input.left.isPressed()){
            xa--;
        }


        if (xa != 0 || ya != 0){
            move(xa, ya);
            isMoving = true;
        }else{
            isMoving = false;
        }
    }

    public void render(Screen screen) {
        int xTile = 0;
        int yTile = 28;

        int modifier =  8*scale;
        int xOffset = x - modifier/2;
        int yOffset = y - modifier /2-4;

        screen.render(xOffset, yOffset, xTile + yTile * 32, color);
        screen.render(xOffset + modifier, yOffset, (xTile + 1) + yTile * 32, color);

        screen.render(xOffset, yOffset + modifier, xTile + (yTile + 1) * 32, color);
        screen.render(xOffset + modifier, yOffset + modifier, (xTile + 1) + (yTile + 1) *      32, color);


    }

    public boolean hasCollided(int xa, int ya) {
        return false;
    }

}

И класс ввода:

package ca.wamlab.game;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class InputHandler implements KeyListener{

    public InputHandler(Game game) {
        game.addKeyListener(this);
    }

    public class Key {
        private int numTimesPressed;
        private boolean pressed = false;

        public int getNumTimesPressed(){
            return numTimesPressed;
        }

        public boolean isPressed(){
            return pressed;
        }
        public void toggle(boolean isPressed){
            pressed = isPressed;
            if(isPressed)numTimesPressed++;
        }
    }

    public Key up = new Key();
    public Key down = new Key();
    public Key right = new Key();
    public Key left = new Key();

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        toggleKey(e.getKeyCode(), true);
    }

    public void keyReleased(KeyEvent e) {
        toggleKey(e.getKeyCode(), false);
    }

    public void toggleKey(int keyCode, boolean isPressed){
        if(keyCode == KeyEvent.VK_W  || keyCode == KeyEvent.VK_UP){ up.toggle(isPressed);}
        if(keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN){ down.toggle(isPressed);}
        if(keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT){ right.toggle(isPressed);}
        if(keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT){left.toggle(isPressed);}




    }
}

Я знаю, что получаю это из-за того, что что-то в коде установлено в null (я думаю, что это ispressed()), но я не могу понять, как его исправить...

  • 2
    Где именно находится строка 20?
  • 0
    Я думаю, что у вас есть нить гонки. Что ты об этом думаешь? Это объяснило бы нулевое значение любого из ваших значений, которые не были объявлены до начала гонки.
Показать ещё 12 комментариев
Теги:
nullpointerexception

1 ответ

2
Лучший ответ

Переменные экземпляра вверх, вниз, вправо, слева в классе InputHandler инициализируются

public Key up = new Key();
public Key down = new Key();
public Key right = new Key();
public Key left = new Key();

Если ввод является ссылочной переменной InputHandler, и объект InputHandler оспаривается, то вверх, вниз, вправо и влево никогда не может быть null на основе выше кода. Поэтому, основываясь на подтверждении строки 20, это if(input.up.isPressed()){ наиболее вероятно, input является нулевым.

Это поможет нам помочь вам, если вы можете предоставить код, в InputHander input назначается объекту, если в любом случае это делается. Где в коде прослушиватель ключей зарегистрирован с помощью addKeyListenter()? А также предоставленный метод tick() относится к тому классу?

Из stacktrace очевидно, что все три класса Player, Level и Game имеют метод с таким же именем tick()

at ca.wamlab.game.entities.Player.tick(Player.java:20)
    at ca.wamlab.game.level.Level.tick(Level.java:38)
    at ca.wamlab.game.Game.tick(Game.java:169)

Многие важные детали неизвестны, чтобы помочь с этим. Более подробная информация была бы полезной.

  • 0
    Метод игровых тиков вызывает метод тиков уровня. Который вызывает метод тиков игроков, когда происходит NPE.
  • 0
    Основной (игровой) метод Tick public void tick () {tickCount ++; level.tick (); }
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню