2

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

球类扩展了实体类,有 5 个变量。

screen 函数有一个paint方法:

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());

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

谢谢!

4

3 回答 3

4

你打电话:

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

这意味着您希望从您初始化的实例中检索值。并且在初始化完成之前,它是空的。因此,NPE(缩写NullPointerException)。

于 2013-06-07T17:10:39.723 回答
3

你的线

Ball ball;

实际上并没有创建一个新的 Ball 对象,所以引用ball设置为null. 当您尝试检索ball构造函数中的成员时,它会抛出NullPointerException. 在这种情况下,在其自己的构造函数中使用对象实例的成员有点可疑。

于 2013-06-07T17:11:07.533 回答
2

你的问题是这一行:

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

您正在尝试为ball尚不存在的值分配值。改为传递一些实际值:

ball = new Ball(5, 4, 2, 7, 7);
于 2013-06-07T17:13:42.030 回答