为什么我有时只会得到这个错误?

问题描述:

基本上,我有一个碰撞检测的基本方法,有时当我运行小程序,它的工作原理,但大部分时间它的工作。这里是错误和一些代码:为什么我有时只会得到这个错误?

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); 

任何帮助非常感谢!提前致谢!

+3

我的猜测是在多线程应用程序缺乏共享,可变数据同步。 – duffymo 2012-03-13 21:07:31

+0

感谢您的快速回复,但我该如何解决这个问题? – hazard1994 2012-03-13 21:08:11

+1

首先,你需要弄清楚它是'player','player.playerRect'还是''null'平台'...我们没有足够的信息去了解。 – 2012-03-13 21:09:58

答案是player,player.playerRectplatformnull

您需要将它们分解为单独的检查以确定哪一个为空(或者在调试器中用断点停止)。

分离出的检查,您的代码会是这个样子:

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,但在比较之后并且有机会对结果采取行动之前,另一个线程将更改该对象。

想象一下这一系列事件:

  • 线程一个检查,发现playernull
  • 线程运行,并与null
  • 线程线程替换player一个运行,认为player不是null,尝试一个CCESS其playerRect成员,但因为现在这是null,它NullPointerException抛出
+0

如何分开支票? – hazard1994 2012-03-13 21:17:17

+0

感谢您的帮助 – hazard1994 2012-03-13 21:17:47

+0

非常感谢! – hazard1994 2012-03-13 21:31:45