2016-09-03 8 views
1

これはコードです:、java.lang.NullPointerExceptionが

import java.applet.Applet; 
import java.awt.Color;` 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

@SuppressWarnings("serial") 
public class Pong extends Applet implements Runnable, KeyListener{ 

final int width = 700, height = 500; 

public static int score = 0; 

Thread thread; 
HumanPaddle p1; 
Ball b1; 

public void init(){ 
    this.resize(width, height); 

    this.addKeyListener(this); 

    thread = new Thread(this); 
    thread.start(); 

    p1 = new HumanPaddle(1); 
    b1 = new Ball(); 
} 

public void paint(Graphics g){ 
    g.setColor(Color.black); 
    g.fillRect(0, 0, width, height); 
    p1.draw(g); 
    b1.draw(g); 

    g.setColor(Color.red); 
    g.drawString("Score: " + Integer.toString(score), width/2 - 20, 10); 

} 

public void update(Graphics g){ 
    paint(g); 
} 

public void run() { 
    for(;;){ 

     p1.move(); 
     b1.move(); 

     b1.paddleCollision(p1, p1); 

     if(b1.getX() > width + 10){score++; 
     }else if(b1.getX() < -10){score--;} 

     repaint(); 

     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

public void keyPressed(KeyEvent key) { 
    if(key.getKeyCode() == KeyEvent.VK_UP || key.getKeyCode() == KeyEvent.VK_W){ 
     p1.setUpAccel(true); 
    }else if(key.getKeyCode() == KeyEvent.VK_DOWN || key.getKeyCode() == KeyEvent.VK_S){ 
     p1.setDownAccel(true); 
    } 
} 

public void keyReleased(KeyEvent key) { 
    if(key.getKeyCode() == KeyEvent.VK_UP || key.getKeyCode() == KeyEvent.VK_W){ 
     p1.setUpAccel(false); 
    }else if(key.getKeyCode() == KeyEvent.VK_DOWN || key.getKeyCode() == KeyEvent.VK_S){ 
     p1.setDownAccel(false); 
    } 
} 

public void keyTyped(KeyEvent key) { 

} 

} 

事SOMETIMES、唯一時には、コードが失敗し、スレッド「スレッドで例外」

を示すことです-3" java.lang.Thread.runで Pong.run(Pong.java:48)でjava.lang.NullPointerExceptionが(不明なソース)」

私はerrがあります意味を知っていますまたは48行目48行目: "p1.move();"

、それが有効な方法であり、唯一、時には失敗するので、非理にかなって...

してください、私は迅速な助けを必要と...事前にありがとうございます。

+0

あなたのクラスが実装し 'Runnable'が、あなたの'ラン() 'メソッドは' @ Override'でアノテートされていません。つまり、警告が有効になっていないことを意味します。妥当な数の警告を有効にしてコードを書くことを最初に学ばない限り、プログラマーとして多くのことを達成するつもりはありません。 –

答えて

4

競合状態です。 p1が初期化される前にinit()でスレッドを開始するので、initがinitを初期化する前にスレッドが実行される危険性があります。あなたが唯一のスレッドの開始前に、P1とB1の初期化を移動する必要が:

... 
    p1 = new HumanPaddle(1); 
    b1 = new Ball(); 

    thread = new Thread(this); 
    thread.start(); 
} 
関連する問題