有时抛出NullPointerException,有时不抛出。怎么修?

时间:2012-08-16 10:29:41

标签: java nullpointerexception collision-detection

以下是对象初始化的摘录:

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

这是getBounds()方法:

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

这是控制台消息:

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是调用getBounds()方法的时候。有时抛出异常,并且第10次中有1次不是。任何修复?

2 个答案:

答案 0 :(得分:0)

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

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

  1. 更改上述行为,以便在为tenBullets调用getBounds()之前始终为tenBullets指定值。如果此时从不为空,则可以选择此选项if (tenBullets == null)
  2. 使问题中的代码容忍null - 检查tenBullets,如果这是真的,则采取一些替代操作。这是选择null是否可能是一个合理的值(也许它可能会或可能不会被初始化)的选项;如果是这样,你必须处理这种可能性。
  3. 如果不了解代码的意图或上下文,就不可能给出具体的建议。但是,如果final是一个字段(而不是局部变量),请考虑永远是否有意义使其无法设置(或修改);如果没有,请声明tenBullets。这将保证它在构造函数中初始化并保持该值一致。

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

答案 1 :(得分:0)

从你所展示的内容来看,我无法肯定地说,但有时候当我重命名文件和代码片段时,我会在Eclipse中出现不一致的地方。即使一切都是正确的,Eclipse也会缓存一些可能会发生冲突的旧名称。

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

同样,不确定这是否是您的问题,但我之前已经看过