Java方法跨入if子句,即使它';这是假的

Java方法跨入if子句,即使它';这是假的,java,if-statement,arraylist,Java,If Statement,Arraylist,我使用的是一种叫做每秒60x的同步方法。该方法检查ArrayList是否为空。即使它是空的,它也会进入if子句 public synchronized void removeGameObjectsFromList() { if (!GAMEOBJECTSTOREMOVE.isEmpty()) { for (int i = 0; i < GAMEOBJECTSTOREMOVE.size(); i++) { GameObj

我使用的是一种叫做每秒60x的同步方法。该方法检查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());
}
为什么它可以进入if(),不管它是否为空

该方法在“BulletManager”中调用,它更新我视图中的所有“活动”项目符号:

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();
AnimationTimer timer=新的AnimationTimer()
{
@凌驾
公共无效句柄(长)
{
如果(!(BULLETS.isEmpty())
{
对于(int i=0;i0)
{
currentbill.move(currentbill.getANGLE());
currentBullet.getCurrentImageView().setTranslateX(currentBullet.getCoordinate().getX());
currentBullet.getCurrentImageView().setTranslateY(currentBullet.getCoordinate().getY());
currentBullet.decrementDistance();
}否则
{
GAMEMANAGER.addGameObjectToBeRemoved(当前项目符号);
}
}
}
}
};
timer.start();

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

if (!GAMEOBJECTSTOREMOVE.isEmpty())
{
    /* ... */
    GAMEOBJECTSTOREMOVE.clear();
    System.out.println("Finished");
}
System.out.println(GAMEOBJECTSTOREMOVE.isEmpty());
所以,如果它不是空的,你清除它的内容,使它成为空的,然后你打印它是空的

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


因此,您将始终在第二个
System.out.println
上打印
true
,这是在
清除

后发生的,我找到了解决方案。。。我只是个傻瓜。。。太蠢了。。。如果我创建了一个项目符号,该对象将添加到GameManager“GAMEOBJECTLIST”和BulletManager“BULLETLIST”。。。达到子弹的最大距离后,它将从GameManager列表中删除,但不会从BulletManager列表中删除。。。这就是洞的问题。。。现在一切都好了。。。我很蠢

有很多可能发生这种情况的原因…请提供一个。空检查是没有意义的,因为for循环已经检查了大小。列表不是空的。将内容放入ArrayList的代码是否也在同一对象上同步?@Myrtium将
System.out.println(…)
移动到方法的开头,然后重新运行程序。我愿意赌一些钱,赌输出会改变。好吧,我试过了,但输出是一样的:(真的,完成了,真的,完成了)你试过了。。。什么我没有建议对这里的代码进行任何更改。我只是展示了
GAMEOBJECTSTOREMOVE
的内容发生了什么变化;循环是不相关的,因为它不会变异。哦,对不起。。。我以为你出于任何原因建议减少代码。。。也可能看到一个鬼鬼祟祟的误会这里没有什么鬼鬼祟祟的。你正在清理一个集合,然后想知道为什么它显示为空的。不。。。我正在清除ArrayList,在清除它之后,shloudnt再进入if()子句,因为它显然应该是空的,但它不是。
if (!GAMEOBJECTSTOREMOVE.isEmpty())
{
    /* ... */
    GAMEOBJECTSTOREMOVE.clear();
    System.out.println("Finished");
}
System.out.println(GAMEOBJECTSTOREMOVE.isEmpty());