gpt4 book ai didi

java - 线程中出现异常 "Thread-2"java.lang.NullPointerException

转载 作者:行者123 更新时间:2023-11-30 03:50:44 25 4
gpt4 key购买 nike

每当我运行我的程序时,我都会收到此错误:

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()),但我不能想办法解决这个问题...

最佳答案

InputHandler类中的实例变量up、down、right、left初始化为

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

如果input是InputHandler的引用变量,并且赋值给它一个InputHandler的对象,那么根据上面的代码,上、下、右、左永远不可能为空。因此,根据确认第 20 行是 if(input.up.isPressed()){ 最有可能的 input 为 null。

如果您可以提供代码,其中 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)

许多重要细节尚不清楚,无法帮助解决此问题。更多详细信息将会有所帮助。

关于java - 线程中出现异常 "Thread-2"java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com