零点异常,不明白为什么?

Poo*_*eek 1 java exception-handling nullpointerexception

好吧,我是java的新手,我正在制作一个乒乓球游戏.我想完全靠自己做,但我遇到了问题.到目前为止,我有2节课.我的主要球员之一,其中包含有关球的信息.我的主要课程如下:

    import java.awt.Canvas;
import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;


public class Main extends Canvas implements Runnable{

    private static final long serialVersionUID = 1L;

    public static int Width=800;
    public static int Height=600;
    public boolean Running=false;
    public Thread thread;
    public Ball ball;
    public int BallX = ball.BallLocationX;
    public int BallY = ball.BallLocationY;



    public static void main(String[] args){
        Main game = new Main();
        JFrame frame = new JFrame();
        frame.setSize(Width, Height);
        frame.setTitle("Pong By Poo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.add(game);
        game.start();
        }


    public void start(){
        if(Running==true){
            return;
        }
        else {
            Running=true;
            thread = new Thread(this);
            thread.start();
        }
    }



    public void run(){
        while(Running==true){
            Draw();
        }

    }

    public void Draw(){
        BufferStrategy bs = this.getBufferStrategy();
        if(bs==null){
            createBufferStrategy(2);
        }else{
            Graphics g = bs.getDrawGraphics();
            g.setColor(Color.BLACK);
            g.fillOval(BallX, BallY, 10, 10);   
        }


    }

}
Run Code Online (Sandbox Code Playgroud)

我的球类是这样的:

    **import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Ball extends JPanel{
    public int BallLocationX;
    public int BallLocationY;
    public boolean BallMovementY; //true makes the ball go up, false makes it go down
    public boolean BallMovementX; //True makes the ball go right, false makes it go left.

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillOval(BallLocationX, BallLocationY, 10, 10);
    }

    //moves the ball left to right
    public int YVelocity(){

        if(BallMovementY==true){
            BallLocationY++;
        }
        else{
            BallLocationY--;
        }

        return BallLocationY;

    }

    //Moves the ball up and down
    public int XVelocity(){

        if(BallMovementX==true){
            BallLocationX++;
        }
        else{
            BallLocationX--;
        }

        return BallLocationX;

    }
}
**
Run Code Online (Sandbox Code Playgroud)

我试图在我的主要课堂内的屏幕上画球,使用我从球类获得的球的位置.我知道(截至目前)球不会移动,我想出来以后.我的问题是,它不会在屏幕上画球,给我这个错误:

Exception in thread "main" java.lang.NullPointerException
    at Main.<init>(Main.java:20)
    at Main.main(Main.java:26)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Roh*_*ain 14

public Ball ball;  // ball is not initialized
public int BallX = ball.BallLocationX;  // NPE here
public int BallY = ball.BallLocationY;
Run Code Online (Sandbox Code Playgroud)

这是问题所在.在您的实例变量声明中,您ball仍然指向null并且您已使用它进行访问BallLocationX.它会抛出一个NPE.

您应该初始化您的ball引用以指向Ball第一个实例: -

public Ball ball = new Ball();  // Or whatever way you use to instantiate it
public int BallX = ball.BallLocationX;
public int BallY = ball.BallLocationY;
Run Code Online (Sandbox Code Playgroud)

一个建议 : -

  • 我刚注意到,你已经习惯public modifier了所有的 fields.你不应该这样做.尽可能尝试 private modifier使用您的字段,并提供public accessors访问它们.(getter和setters).
  • 另外,请遵循Java命名约定.变量名应该以小写字母/下划线/美元符号(变化开始BallXballXBallLocationXballLocationX)