以下是对象初始化的摘录:
...
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次不是。任何修复?
答案 0 :(得分:0)
NullPointerException
被抛出,因为调用该方法时tenBullets
为null
- 并且您尝试在空对象上调用方法(这是不可能的,并且导致异常)。
为了解决这个问题,您需要做以下两件事之一:
tenBullets
调用getBounds()
之前始终为tenBullets
指定值。如果此时从不为空,则可以选择此选项if (tenBullets == null)
。tenBullets
,如果这是真的,则采取一些替代操作。这是选择null是否可能是一个合理的值(也许它可能会或可能不会被初始化)的选项;如果是这样,你必须处理这种可能性。如果不了解代码的意图或上下文,就不可能给出具体的建议。但是,如果final
是一个字段(而不是局部变量),请考虑永远是否有意义使其无法设置(或修改);如果没有,请声明tenBullets
。这将保证它在构造函数中初始化并保持该值一致。
通常,减少可变字段/变量的数量可以更容易推理程序,因为您需要不太了解它在执行时可能会或可能不会处于什么状态。这听起来像是你的问题,{{1}}在某些时候由其他一些代码分配,并且没有明确的排序。
答案 1 :(得分:0)
从你所展示的内容来看,我无法肯定地说,但有时候当我重命名文件和代码片段时,我会在Eclipse中出现不一致的地方。即使一切都是正确的,Eclipse也会缓存一些可能会发生冲突的旧名称。
要解决此问题,请转到项目 - >清理并删除所有已编译的文件。
同样,不确定这是否是您的问题,但我之前已经看过