为什么我有时只会得到这个错误?
基本上,我有一个碰撞检测的基本方法,有时当我运行小程序,它的工作原理,但大部分时间它的工作。这里是错误和一些代码:为什么我有时只会得到这个错误?
Exception in thread "Thread-3" java.lang.NullPointerException
at zombies.Main.checkCollision(Main.java:110)
at zombies.Main.run(Main.java:140)
at java.lang.Thread.run(Unknown Source)
public void checkCollision(){
if(player.playerRect.intersects(platform.platformRect)){ // line 110
player.dy = 0;
player.y = (platform.y - player.height);
player.isTouching = true;
}
....
@Override
public void run() {
try {
while(true){
checkCollision(); // line 140
player.move();
Thread.sleep(15);
任何帮助非常感谢!提前致谢!
答案是player
,player.playerRect
或platform
是null
。
您需要将它们分解为单独的检查以确定哪一个为空(或者在调试器中用断点停止)。
分离出的检查,您的代码会是这个样子:
if (player == null) {
throw new NullPointerException("player is null");
}
if (player.playerRect == null) {
throw new NullPointerException("player.playerRect is null");
}
if (platform == null) {
throw new NullPointerException("platform is null");
}
这将让你看看例外,以确定哪些对象是null
。然后,您可以检查代码,找出为什么该对象有时会设置为空,并修复该情况。
或者,您可以绕过代码的这一部分,而不是抛出NullPointerException
,因为它可能对该对象有效为null
。这就是说,如果你正在处理多个线程,而且问题只是偶尔出现,那么你应该看看Java的锁定,同步和其他并发工具。否则,你可能会遇到这样一种情况:一个线程检查对象是否为null
,但在比较之后并且有机会对结果采取行动之前,另一个线程将更改该对象。
想象一下这一系列事件:
- 线程一个检查,发现
player
不null
- 线程乙运行,并与
null
- 线程线程替换
player
一个运行,认为player
不是null
,尝试一个CCESS其playerRect
成员,但因为现在这是null
,它NullPointerException
抛出
如何分开支票? – hazard1994 2012-03-13 21:17:17
感谢您的帮助 – hazard1994 2012-03-13 21:17:47
非常感谢! – hazard1994 2012-03-13 21:31:45
我的猜测是在多线程应用程序缺乏共享,可变数据同步。 – duffymo 2012-03-13 21:07:31
感谢您的快速回复,但我该如何解决这个问题? – hazard1994 2012-03-13 21:08:11
首先,你需要弄清楚它是'player','player.playerRect'还是''null'平台'...我们没有足够的信息去了解。 – 2012-03-13 21:09:58