检查对象时的NPE?

时间:2013-12-06 11:13:40

标签: java

所以我觉得自己像个白痴,但我正在尝试实现碰撞检测,我需要检查玩家旁边是否有瓷砖。当我去检查一个,首先我看看我正在寻找的瓷砖是否真的存在。如果是,我继续选择图块并从中创建一个新对象。如果不是,我不碰瓷砖。但是,当我试图检查瓷砖时,我正在获得NPE!这是检查代码(只是一个相关的小部分):

if (world.tiles[(int) getX() / 32][(int) getY() / 32] != null) {
        Tile t = world.tiles[(int) getX() / 32][(int) getY() / 32];

这是世界级的tile数组,我将其传递给播放器:

    public Tile[][] tiles;

以及我如何创建它们:

tiles = new Tile[mx][my];
    for (int x = 0; x < mx; x++) {
        for (int y = 0; y < my; y++) {
            if (rand.nextInt(2) == 0) {
                tiles[x][y] = new Tile(x * 32, y * 32, 32);
            }else if(y == 0){
                tiles[x][y] = new Tile(x * 32, y * 32, 32);
            }
        }
    }

如您所见,我获取玩家位置,然后除以图块大小(32)以获取图块坐标,然后检查图块是否为空。我知道我正在向世界传递给玩家,所以这不是问题所在。问题是,当我寻找瓷砖时,它是空的!为什么呢?

3 个答案:

答案 0 :(得分:1)

请在下一篇文章中包含错误发生位置的确切错误消息,现在我可以假设两件事:

  • 您没有初始化world
  • 您没有初始化rand

我被敦促认为您忘记初始化rand,因为您似乎习惯于正确初始化数组。

答案 1 :(得分:1)

您正在使用两个if语句初始化所有切片:

 if (rand.nextInt(2) == 0) { // only executes when your random number is 0
     tiles[x][y] = new Tile(x * 32, y * 32, 32);
 }else if(y == 0){ // only executes once for each iteration of the outer for
     tiles[x][y] = new Tile(x * 32, y * 32, 32);
 }

答案 2 :(得分:0)

OP是关于导致NPE的线的具体信息:

if (world.tiles[(int) getX() / 32][(int) getY() / 32] != null) {
因此,由于if块未覆盖所有可能性而导致某些图块未初始化,因此可能 nothing

或者:

1)worldnull

2)getX()getY()null,因此转化为int(a.k.a。取消装箱)失败。