2012-03-13 118 views
0

基本上,我有一個碰撞檢測的基本方法,有時當我運行小程序,它的工作原理,但大部分時間它的工作。這裏是錯誤和一些代碼:爲什麼我有時只會得到這個錯誤?

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

回答

1

答案是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