【问题标题】:java.lang.NullPointerException when running program运行程序时出现 java.lang.NullPointerException
【发布时间】:2013-06-07 17:09:05
【问题描述】:

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

ball类扩展了实体类,有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());

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

谢谢!

【问题讨论】:

  • 为了更好的帮助,请尽快发布SSCCE,简短,可运行,可编译,在此之前将所有球放入数组,在paintComponent内部从数组中拾取球,从Swing Timer调用,否则每个这里的答案可能是黑暗的短裤

标签: java swing inheritance constructor paint


【解决方案1】:

你打电话:

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

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

【讨论】:

  • 感谢您的回答。那么,我该如何防止这种情况发生呢?
  • 您需要将值传递给构造函数(对于重量、宽度等)。真实值 ;) 如果您有默认值,只需创建一个空构造函数并执行new Ball()。这将至少修复 ball 初始化。之后……
  • 那么,我该如何防止这种情况发生呢? == 通过删除 ball.paint(g);,重新阅读我的评论,这些答案再次基于您的模糊问题
【解决方案2】:

你的线路

Ball ball;

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

【讨论】:

    【解决方案3】:

    你的问题是这一行:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 2020-07-02
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      相关资源
      最近更新 更多