ArrayList size()方法崩溃程序

时间:2016-04-19 01:39:53

标签: java arraylist window

我目前正在开发一款使用LWJGL 3.0.0b的游戏,并且出现了一个奇怪的现象。

背景

我有一个自定义实体类和一个实体管理器来存储我的实体。当实体更新时,一个方法被称为名为" tickTrail"它增加了一个跟踪实体,使图形在视觉上更好,更有趣。

我已将其简化为entities.size()功能,是的,我试着自己解决这个问题:P

我目前的解决方案是替换所有类似的方法:

for (int i = 0; i < entities.size(); i++)
{
  //calls a method for drawing, updating, or input
}

将每个entities.size()替换为sizesize是一个变量,当实体被添加,​​删除,清除列表或仅移除敌人时,它会发生变化。

此方法100%工作,窗口拖动不会使用此方法使程序崩溃。

问题

总而言之,最后一个问题是为什么会发生这种情况?我还没有确定为什么拖动一个窗口并使用ArrayList的size()方法崩溃程序,但在其位置存储变量是完全正常的。

对这种奇怪现象的任何帮助或解释都非常感激:)

修改 上次编辑证明不正确,即使使用大小变量程序仍然崩溃,时间回到绘图板....

编辑两个 好的,所以有时窗口拖动会在其他时间不起作用,这可能不仅仅是一个简单的size()方法调用:/

1 个答案:

答案 0 :(得分:2)

根据你提供的内容很少,我猜测多个线程正在同时访问ArrayList而线程正在踩踏所有其他线程。

如果您没有通过Collections.synchronizedList()创建列表,以保证列表中的所有操作都是原子的,以便数组的内部不会被破坏。

我走这条路的原因是拖动Windows可能会生成多个事件来更新数组,而你正试图同时迭代它。

当您使用变量来查看大小时,并发问题就会消失。当然,除非您使用AtomicInteger或其他任何东西,否则您可能在变量中没有正确的值,但至少不会抛出异常。