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