繁体   English   中英

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

[英]Sometimes throw NullPointerException, and sometimes not. How to fix?

这是对象初始化的摘录:

    ...
            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()方法时。 有时会引发异常,而第十次异常中不会抛出异常。 有任何解决办法吗?

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

为了解决此问题,您需要执行以下两项操作之一:

  1. 更改前面的行为,以便在对tenBullets调用getBounds()之前始终tenBullets分配一个值。 这是可以选择的选项,因为tenBullets在这一点上绝对不能为null。
  2. 使问题容忍代码中的代码为if (tenBullets == null)检查if (tenBullets == null) ,如果为true,则采取一些替代措施。 这是一个选择,选择null是否很可能是一个明智的值(也许可以初始化也可以不初始化); 如果是这样,您必须应对这种情况。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM