Java NullPointerException可以';找不到来源

Java NullPointerException可以';找不到来源,java,exception,pointers,null,Java,Exception,Pointers,Null,我正在编写一个java rpg游戏,已经陷入了僵局。我的代码目前有精灵动画,一个随机贴图生成与柏林噪声和碰撞检测。地图是平铺的,所以我目前正在尝试将柏林噪波转换为平铺。perlin函数生成一个数组,并将该数组中的每个数字转换为一个平铺png。这就是问题所在:运行时错误:Java.Lang.NullPointerException。 问题是我的编译器(netbeans)没有告诉我错误发生在哪里,而是只给我这个错误代码。通过一个排除过程,我设法找到了发生在第364行的错误。如果此站点不支持行,则使用

我正在编写一个java rpg游戏,已经陷入了僵局。我的代码目前有精灵动画,一个随机贴图生成与柏林噪声和碰撞检测。地图是平铺的,所以我目前正在尝试将柏林噪波转换为平铺。perlin函数生成一个数组,并将该数组中的每个数字转换为一个平铺png。这就是问题所在:运行时错误:Java.Lang.NullPointerException。
问题是我的编译器(netbeans)没有告诉我错误发生在哪里,而是只给我这个错误代码。通过一个排除过程,我设法找到了发生在第364行的错误。如果此站点不支持行,则使用loadTile()方法,在“If(perlinIsland[x][y]中,有限的catch块代码会妨碍您查找空值的能力

例如,以下代码行:

  try {
     while (true) {
        moveMap();
        if (!still)
           update(System.currentTimeMillis());
        Thread.sleep(13);
     }
  } catch (Exception e) {
     System.out.println("RUNTIME ERROR: " + e);
  }
将只打印

RUNTIME ERROR: java.lang.NullPointerException
当此代码运行到NPE时,没有行号或堆栈跟踪

首先,您不应该捕获普通异常,而应该捕获显式异常。接下来,您应该使用信息更丰富的catch块,例如至少通过
e.printStackTrace()
打印堆栈跟踪的catch块

上面的代码块应该写出来:

public void run() {
  while (true) {
     moveMap();
     if (!still)
        update(System.currentTimeMillis());
     try {
        Thread.sleep(13);
       // only catch the explicit exception and in localized code if possible.
     } catch (InterruptedException e) {
        e.printStackTrace();
     }
  }
}
这样做,您将看到NPE发生在这里:

if (in.intersects(blocks[x][y]) && isSolid[x][y] == true) {
然后,您可以在该行前面填充代码,以查看导致问题的变量:

e、 g

              if (blockImg[x][y] != null) {
                 System.out.println("in is null: " + (in == null));
                 System.out.println("blocks[x][y] is null: "
                       + (blocks[x][y] == null));
                 System.out.println("isSolid is null: "
                       + (isSolid == null));
                 System.out.println("isSolid[x][y] is null: "
                       + (isSolid[x][y] == null));

                 if (in.intersects(blocks[x][y]) && isSolid[x][y] == true) {
                    {
                       return true;
                    }
                 }
              }
您将看到问题是
isSolid[x][y]
为空:

in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
Exception in thread "Thread-3" java.lang.NullPointerException
    at pkg.Main.collide(Main.java:465)
    at pkg.Main.moveMap(Main.java:557)
    at pkg.Main.run(Main.java:693)
    at java.lang.Thread.run(Unknown Source)
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
这是为什么?它是一个布尔数组,不是布尔数组,所以它没有初始化为Boolean.FALSE,而是默认为null。解决方案:使用Boolean[]]数组或显式初始化数组

最重要的是:对一般异常使用信息性catch块和don-catch



编辑请注意,为了让我运行您的代码,我必须禁用您对图像和精灵表的使用,因为这些资源对我来说是不可用的。但这项工作应该由您来完成,因为您是未来的搜索者。我要求在将来,您将您的代码限制为最小的代码我们可以进行测试和运行,以演示您的问题,但没有与您的问题无关的代码,并且不依赖外部资源,如图像、数据库等。

stacktrace应该是一个良好的开端:)太多的代码,包括注释掉的代码。你应该一步一步地诊断这个问题,减少代码量,直到它变得可管理为止。在这一点上,你很可能已经自己发现了问题。你无法用有限的catch块代码找到异常:
catch(Exception e){System.out.println(“运行时错误:+e);}
。至少打印堆栈跟踪。至少有
e.printStackTrace()
在您的catch block中。非常感谢您提供了这个非常好的答案!您可能已经知道,我对编程非常陌生,这些技巧在将来肯定会对我有所帮助!再次感谢!:)@user2614974:不客气。请参阅编辑以回答您在本网站上的下一个问题。我们感谢您为此所付出的一切努力,以便我们能够运行你的代码,帮助你更好。好的,我会确保正确格式化我的代码,再次感谢:)@user2614974:我要求你做的不仅仅是格式化。请阅读链接和编辑。同样,这项工作花费了我40多分钟,你真的应该做这项工作,让我们更轻松。
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
Exception in thread "Thread-3" java.lang.NullPointerException
    at pkg.Main.collide(Main.java:465)
    at pkg.Main.moveMap(Main.java:557)
    at pkg.Main.run(Main.java:693)
    at java.lang.Thread.run(Unknown Source)
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true
in is null: false
blocks[x][y] is null: false
isSolid is null: false
isSolid[x][y] is null: true