根据级别

时间:2018-05-17 12:44:56

标签: java object nullpointerexception linked-list

所以基本上我要做的就是让一个老板产生(永远10级)并且让屏幕上的其他所有敌人都被移除。所有对象都在链表中并扩展GameObject。

在GameObject中,我删除了一个布尔值:

public GameObject(float x, float y, ID id) {
    this.x = x;
    this.y = y;
    this.removed = removed;
    this.id = id;
}

在我的处理程序中删除前一个帖子中的另一个建议:

for (int i = 0; i < object.size(); i++) {
         if (object.get(i).removed == true)
              object.remove(i);
    }

我检查关卡并移除敌人的方式是(基本敌人阵容41)这是基本的敌人类:

if(hud.level % 10 == 0) {
        this.removed = true;
    }

每次我运行代码并且敌人产生它时会在基本敌人的第41行抛出nullPointerException。完整错误是:

Exception in thread "Thread-0" java.lang.NullPointerException
at BasicEnemy.tick(BasicEnemy.java:41)
at Handler.tick(Handler.java:13)
at Game.tick(Game.java:92)
at Game.run(Game.java:73)
at java.base/java.lang.Thread.run(Thread.java:844)

int级别是public并且在开始时设置为1

我对LinkedLists不是很好,所以这非常令人困惑。

修改

hud.level是

public int level = 1;

HUD是一个跟踪叠加层,当前关卡和得分的代码,用于提高分数和等级:

public void tick() {

    HEALTH = Game.clamp(HEALTH, 0, 100);
    greenValue = Game.clamp(greenValue, 0, 255);

    greenValue = HEALTH * 2;

    score++;

}

等级:

public void tick() {
    scoreKeep ++;

    if(scoreKeep >= 100) {
        scoreKeep = 0;
        hud.setLevel(hud.getLevel() + 1);

1 个答案:

答案 0 :(得分:1)

由于您致电this.removed = true;,我们知道这是booleanBoolean。我

public GameObject(float x, float y, ID id) {
    this.x = x;
    this.y = y;
    this.removed = removed; // ####
    this.id = id;
}

但您没有removed参数,因此它与this.removed = this.removed相同或与不执行相同。

现在,removed类型有两种可能性:。

  • boolean默认false
  • 一个Boolean,默认null

如果object.get(i).removed == trueNullPointerException,则调用Boolean会触发Boolean(因为从booleanobject.removeIf(GamObject::isRemoved) 的外包装。)

供参考:

删除每个标志值的循环可以更改为使用带有谓词的Collection.removeIf(这里,getter返回一个布尔值)来删除每个标记的项(该方法迭代集合)

public boolean isRemoved()

假设GameObject中有一个吸气器routes->web.php