0

Here's an excerpt of the init of the object:

    ...
            Rectangle b1 = tenBullets.getBounds();
    ...

Here's the getBounds() method:

public Rectangle getBounds() {
    return new Rectangle(x, y, 200, 25);
}

And here is the console message:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at test.game.Board.checkCollisions(Board.java:75)
at test.game.Board.actionPerformed(Board.java:53)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Board.java:75 is when the getBounds() method is called. Sometimes the exception is thrown, and 1 out of the 10th time it's not. Any fixes?

4

2 回答 2

0

NullPointerException抛出是因为tenBulletsnull该方法被调用时——并且您试图在空对象上调用一个方法(这是不可能的,并且会导致异常)。

为了解决这个问题,您需要做以下两件事之一:

  1. 更改前面的行为,以便tenBullets在调用它之前始终为其分配一个值getBounds()。这是选择的选项,此时tenBullets不应为空。
  2. 使问题中的代码能够容忍 null 检查if (tenBullets == null),如果这是真的,请采取一些替代措施。这是选择是否 null 可能是一个合理的值的选项(也许它可能会或可能不会被初始化);如果是这样,您必须应对这种可能性。

如果不了解代码的意图或上下文,就不可能给出具体的建议。但是,如果tenBullets是一个字段(而不是局部变量),请考虑取消设置(或修改)它是否有意义;如果没有,请声明它final。这将保证它在构造函数中初始化并始终保持该值。

通常,减少可变字段/变量的数量可以更容易地推理程序,因为您需要较少了解它在执行时可能处于或可能不处于什么状态。听起来这是您的问题tenBullets,在某些时候由其他一些代码分配,并且没有确定的顺序。

于 2012-08-16T10:37:40.727 回答
0

从您所展示的内容来看,我不能肯定地说,但是当我重命名文件和代码片段时,有时我会在 Eclipse 中遇到不一致的情况。即使一切都正确,Eclipse 已经缓存了一些旧名称,这可能会发生冲突。

要解决此问题,请转到项目 -> 清理并删除所有已编译的文件。

同样,不确定这是否是您的问题,但我以前见过

于 2012-08-16T10:37:52.073 回答