2012-03-13 23 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

+0

クイック返信をありがとうが、どうすればこの問題を解決できますか? – hazard1994

+1

まず、 'player'、' player.playerRect'、 ''ヌル 'である' platform'のどれかを調べる必要があります。 –

答えて

1

答えは、player,player.playerRectまたはplatformのいずれかがnullです。

あなたはそれらを別々のチェックに分割して、どちらがヌルであるかを正確に把握する必要があります(またはデバッガにブレークポイントで停止する)。これは、あなたが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をスローする代わりに、コードのその部分をバイパスすることができます。

つまり、複数のスレッドを処理しているときに問題が発生するだけであれば、Javaのロック、同期、その他の並行処理ツールを調べるべきでしょう。そうでなければ、あるスレッドがオブジェクトがnullであるかどうかをチェックするが、その比較の後、結果に作用する前に別のスレッドがオブジェクトを変更する状況に陥る可能性があります。チェックスレッド

  • playernull
  • スレッドB実行ではなく、null
  • スレッドスレッドplayerを置き換えることを発見:

    は、この一連のイベントを想像してみて実行すると、playernullではないと考えて、そのplayerRectメンバーCCESSが、それは今nullているので、NullPointerException

+0

小切手の分割方法は? – hazard1994

+0

途中で助けてくれてありがとう – hazard1994

+0

ありがとう! – hazard1994

関連する問題