1

好的,我对 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);   
        }


    }

}

我的球类是这样的:

    **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;

    }
}
**

我试图在我的主班内的屏幕上画球,使用我从球班得到的球的位置。我知道(到目前为止)球不会移动,稍后我会弄清楚的。我的问题是它不会在屏幕上绘制球,给我这个错误:

Exception in thread "main" java.lang.NullPointerException
    at Main.<init>(Main.java:20)
    at Main.main(Main.java:26)

谢谢!

4

3 回答 3

14
public Ball ball;  // ball is not initialized
public int BallX = ball.BallLocationX;  // NPE here
public int BallY = ball.BallLocationY;

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

您应该初始化您的ball引用以指向Ballfirst 的实例:-

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

一个建议 : -

  • 我刚刚注意到,您已经使用public modifier了所有 fields. 你不应该那样做。尽可能地 private modifier为您的字段尝试拥有,并提供public accessors访问它们。(getter 和 setter)。
  • 此外,请遵循 Java 命名约定。变量名称应以小写字母/下划线/美元符号开头(更改BallXballX和)BallLocationXballLocationX
于 2012-11-15T16:38:16.443 回答
1

您定义ball,但不使用任何值对其进行初始化,然后在 上调用一个方法ball,即null.

public Ball ball;
public int BallX = ball.BallLocationX;

public一个建议:除非您有充分的理由,否则请不要使用字段。

于 2012-11-15T16:40:17.180 回答
0

frame.setLocationRelativeTo(null); 可能是问题所在。对此发表评论并尝试。

于 2012-11-15T16:38:28.627 回答