Wamlab
Wamlab

Reputation: 23

Exception in thread "Thread-2" java.lang.NullPointerException

Whenever I run my program I get this error:

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)

Ignore all but the first at because all of them are because of that one.

I get that error in the following code:

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

}

And the input class is:

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




    }
}

I know I get this because of the fact that something in the code is set to null (I think it is the ispressed()) but I can't figure out a way to fix it...

Upvotes: 1

Views: 1733

Answers (1)

madhav-turangi
madhav-turangi

Reputation: 431

The instance variables up, down, right, left in InputHandler class are initialized with

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

If input is a reference variable of InputHandler and an object of InputHandler is assinged to it, then the up, down, right and left can never be null based on above code. Therefore based on confirming the line 20 is if(input.up.isPressed()){ most possibly input is null.

It will help us help you, if you can provide code where InputHander input is assigned an object if anywhere done so. Where in the code the key listener registered using addKeyListenter() method? And also the provided tick() method belongs to which class?

From stacktrace it is evident that all three Player, Level and Game classes have method with same name 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)

Many important details are unknown to help with this. More details would be helpful.

Upvotes: 2

Related Questions