【问题标题】:java.lang.NullPointerException in the multithread program多线程程序中的java.lang.NullPointerException
【发布时间】:2017-01-11 07:42:56
【问题描述】:

这是代码:

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.NullPointerException at Pong.run(Pong.java:48) at java.lang.Thread.run(Unknown Source)"

我知道这意味着第 48 行第 48 行出现错误:“p1.move();”

而且毫无意义,因为它是一种有效的方法,并且有时只会失败......

请,我需要快速帮助...提前谢谢你。

【问题讨论】:

  • 您的类实现了Runnable,但您的run() 方法未使用@Override 进行注释。这意味着您没有启用任何警告。除非您首先学会在启用最大合理数量的警告的情况下进行编码,否则您将无法作为程序员完成太多工作。

标签: java windows multithreading awt


【解决方案1】:

你有一个竞争条件。因为您在初始化 p1 之前在 init() 中启动线程,所以您冒着线程可能在 init 有机会初始化它之前运行的风险。只需将 p1 和 b1 的初始化移到线程启动前即可:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多