簡體   English   中英

多線程程序中的java.lang.NullPointerException

[英]java.lang.NullPointerException in the multithread program

這是代碼:

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

}

}

關鍵是有時候,代碼會失敗並顯示

“線程“ Thread-3中的異常”,java.lang.Thread.run(未知源)的Pong.run(Pong.java:48)處的java.lang.NullPointerException”

我知道這意味着第48行第48行有錯誤:“ p1.move();”

並且沒有意義,因為它是一種有效的方法,有時只會失敗...

請,我需要快速幫助...預先感謝您。

您有比賽條件。 因為您在初始化p1之前在init()中啟動了線程,所以冒着線程可能在init有機會對其進行初始化之前運行的風險。 您只需要在線程啟動之前將p1和b1的初始化移到:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM