Java方法跨入if子句,即使它';这是假的
我使用的是一种叫做每秒60x的同步方法。该方法检查ArrayList是否为空。即使它是空的,它也会进入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
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());