运行程序时出现java.lang.NullPointerException

时间:2013-06-07 17:09:06

标签: java swing inheritance constructor paint

我有4节课。一个是抽象实体类,一个是球类,一个是主类,另一个是屏幕类。

ball类扩展了实体类并有5个变量。

屏幕功能有一个绘画方法:

public void paint(Graphics g){
    super.paint(g);
    ball.paint(g);
}

当然,要使用ball.paint需要为它创建一个对象。所以,我制作了球对象:

Ball ball;

然后在屏幕构造函数中添加它,因为我需要(Ball有一个带有5个变量的构造函数):

public Screen(){
    ball = new Ball(ball.getWeight(), ball.getWidth(), ball.getHeight(), ball.getX(), ball.getX());
}

这没有错误,但是当我运行程序时,我在控制台中收到此错误:

Exception in thread "main" java.lang.NullPointerException
at h3x.engine.gfx.Screen.<init>(Screen.java:18)
at h3x.engine.Main.main(Main.java:16)

主要类的第16行是:

frame.add(new Screen());

...屏幕类的第18行是这样的:

ball = new Ball(ball.getWeight(), ball.getWidth(), ball.getHeight(), ball.getX(), ball.getX());

所以我的问题是,为什么会发生这种情况,我该如何解决它。如果需要,我可以在类中输入整个代码。

谢谢!

3 个答案:

答案 0 :(得分:4)

你打电话:

ball = new Ball(ball.getXxx()....)

表示您希望从初始化的实例中检索值。在初始化完成之前,它为null。因此NPE(NullPointerException的缩写)。

答案 1 :(得分:3)

你的行

Ball ball;

实际上并没有制作新的Ball对象,因此引用ball设置为null。当您尝试在构造函数中检索ball成员时,它会抛出NullPointerException。在这种情况下,在自己的构造函数中使用对象实例的成员是一种嫌疑。

答案 2 :(得分:2)

你的问题就在这一行:

ball = new Ball(ball.getWeight(), ball.getWidth(), ball.getHeight(), ball.getX(), ball.getX());

您正在尝试将值ball分配给尚不存在的值。传递一些真正的价值观:

ball = new Ball(5, 4, 2, 7, 7);