Java方法步入if-Clause即使它是假的

时间:2017-05-19 15:22:29

标签: java if-statement arraylist

我使用的是同步方法,每秒调用60次。该方法检查ArrayList是否为空。即使它是空的,它也会进入if子句...

public synchronized void removeGameObjectsFromList()
{
    if (!GAMEOBJECTSTOREMOVE.isEmpty())
    {
        for (int i = 0; i < GAMEOBJECTSTOREMOVE.size(); i++)
        {
            GameObject obj = GAMEOBJECTSTOREMOVE.get(i);
            getRegionNodes().getChildren().remove(obj.getCurrentImageView());
            GAMEOBJECTS.remove(obj.getNAME());             
        }
        GAMEOBJECTSTOREMOVE.clear();
        System.out.println("Finished");
    }
    System.out.println(GAMEOBJECTSTOREMOVE.isEmpty());
}

输出如下:

{true
Finished
true
Finished
true
true
Finished
true
true
Finished
true}

为什么它可以进入if()是否为空?

该方法在&#34; BulletManager&#34;它更新所有&#34;生活&#34;我认为子弹:

AnimationTimer timer = new AnimationTimer()
    {
        @Override
        public void handle(long now)
        {
            if (!(BULLETS.isEmpty()))
            {
                for (int i = 0; i < BULLETS.size(); i++)
                {
                    Bullet currentBullet = BULLETS.get(i);
                    if (currentBullet.getDistance() > 0)
                    {
                            currentBullet.move(currentBullet.getANGLE());
                            currentBullet.getCurrentImageView().setTranslateX(currentBullet.getCoordinate().getX());
                            currentBullet.getCurrentImageView().setTranslateY(currentBullet.getCoordinate().getY());
                        currentBullet.decrementDistance();
                    } else
                    {
                        GAMEMANAGER.addGameObjectToBeRemoved(currentBullet);

                    }
                }

            }
        }
    };
    timer.start();

2 个答案:

答案 0 :(得分:1)

这与线程安全无关,如上面的评论所示。看看这个简化的代码:

if (!GAMEOBJECTSTOREMOVE.isEmpty())
{
    /* ... */
    GAMEOBJECTSTOREMOVE.clear();
    System.out.println("Finished");
}
System.out.println(GAMEOBJECTSTOREMOVE.isEmpty());

所以,如果它不是空的,你清除它的内容,使其为空,然后你打印它是空的。

如果它已经是空的,你只需打印它就是空的。

因此,您将始终在true之后的第二个System.out.println上打印clear

答案 1 :(得分:-1)

Okey我找到了一个解决方案...我只是愚蠢......太笨了......如果我创建了一个Bullet,那么对象就被添加到GameManager“GAMEOBJECTLIST”和BulletManager“BULLETLIST”......之后到达子弹的最大距离,它从GameManager列表中删除,但不是从BulletManager列表中删除......这是漏洞问题......现在一切正常......我很蠢