为什么我有时会收到此错误?

时间:2012-03-13 21:06:22

标签: java nullpointerexception collision

基本上,我有一个基本的碰撞检测方法,有时当我运行applet时,它可以工作,但大部分时间它都可以。这是错误和一些代码:

Exception in thread "Thread-3" java.lang.NullPointerException
at zombies.Main.checkCollision(Main.java:110)
at zombies.Main.run(Main.java:140)
at java.lang.Thread.run(Unknown Source)

    public void checkCollision(){
    if(player.playerRect.intersects(platform.platformRect)){ // line 110

        player.dy = 0;
        player.y = (platform.y - player.height);
        player.isTouching = true;
    }

....

    @Override
public void run() {
    try {
        while(true){

        checkCollision(); // line 140
        player.move();

        Thread.sleep(15);

非常感谢任何帮助!提前谢谢!

1 个答案:

答案 0 :(得分:1)

答案是playerplayer.playerRectplatformnull

您需要将它们分解为单独的检查以确定哪一个为空(或者在调试器中使用断点停止)。

要分开检查,您的代码将如下所示:

if (player == null) {
    throw new NullPointerException("player is null");
}
if (player.playerRect == null) {
    throw new NullPointerException("player.playerRect is null");
}
if (platform == null) {
    throw new NullPointerException("platform is null");
}

这将允许您查看异常以确定哪个对象为null。然后,您可以检查代码以找出有时将该对象设置为null的原因,并修复该情况。

或者,不是抛出NullPointerException,而是绕过代码的那一部分,因为它可能对对象有效null

也就是说,如果您正在处理多个线程,并且有时只会出现问题,那么您应该查看Java的锁定,同步和其他并发工具。否则,您可能会遇到一个线程检查对象是否为null的情况,但在该比较之后以及在有机会对该结果执行操作之前,另一个线程会更改该对象。

想象一下这一系列事件:

  • 主题 A 检查并发现player不是null
  • 线程 B 运行并用player替换null
  • 线程线程 运行,认为player不是null,尝试访问其playerRect成员,但现在是{{1} },它被抛出null