运行程序时的java.lang.NullPointerException

运行程序时的java.lang.NullPointerException,java,swing,inheritance,constructor,paint,Java,Swing,Inheritance,Constructor,Paint,我有四节课。一个是抽象实体类,一个是ball类,一个是主类,另一个是screen类 ball类扩展了entity类并有5个变量 屏幕功能有一种绘制方法: public void paint(Graphics g){ super.paint(g); ball.paint(g); } 当然,要使用ball.paint,需要为它制作一个对象。因此,我将ball对象设置为: Ball ball; 然后将其添加到屏幕构造函数中,因为我需要(Ball有一个包含5个变量的构造函数): 这不

我有四节课。一个是抽象实体类,一个是ball类,一个是主类,另一个是screen类

ball类扩展了entity类并有5个变量

屏幕功能有一种绘制方法:

public void paint(Graphics g){
    super.paint(g);
    ball.paint(g);
}
当然,要使用ball.paint,需要为它制作一个对象。因此,我将ball对象设置为:

Ball ball;
然后将其添加到屏幕构造函数中,因为我需要(Ball有一个包含5个变量的构造函数):

这不会出现错误,但当我运行程序时,控制台中会出现以下错误:

Exception in thread "main" java.lang.NullPointerException
at h3x.engine.gfx.Screen.<init>(Screen.java:18)
at h3x.engine.Main.main(Main.java:16)
…屏幕类的第18行是:

frame.add(new Screen());
ball = new Ball(ball.getWeight(), ball.getWidth(), ball.getHeight(), ball.getX(), ball.getX());
所以我的问题是,为什么会发生这种情况,我该如何解决它。如果需要的话,我可以把整个代码放在类中

谢谢

您呼叫:

ball = new Ball(ball.getXxx()....)
这意味着您希望从初始化的实例中检索值。在初始化完成之前,它是空的。因此出现了NPE(NullPointerException的缩写)。

您的行

Ball ball;

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

您的问题在于这一行:

ball = new Ball(ball.getWeight(), ball.getWidth(), ball.getHeight(), ball.getX(), ball.getX());
您正在尝试为尚未存在的
ball
赋值。而是传入一些实际值:

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

为了获得更好的帮助,请尽快发布一个简短、可运行、可编译的命令,在此之前将所有球放入数组,在paintComponent中从数组中拾取球,从Swing Timer调用,否则这里的所有答案都可能是对答案的暗访。那么,如何防止这种情况发生呢?您需要将值传递给构造函数(对于重量、宽度等)。实际值;)如果您有默认值,只需创建一个空构造函数并执行
newball()
。这将至少修复
初始化。在那之后…那么,我怎样才能防止这种情况发生呢?==通过移除球体。油漆(g);,再读一遍我的信,这些答案同样是基于你的模糊问题
ball = new Ball(5, 4, 2, 7, 7);