java - ArrayList size() 方法导致程序崩溃

标签 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() 方法调用:/

最佳答案

根据您提供的信息,我猜测多个线程正在同时访问 ArrayList,并且这些线程正在践踏所有其他线程。

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

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

当您使用变量来观察大小时,并发问题就会消失。当然,除非您使用 AtomicInteger 或其他什么,否则您可能在变量中没有正确的值,但至少不会引发异常。

关于java - ArrayList size() 方法导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36707040/

相关文章:

java - 机器学习/数据挖掘/大数据 : Popular language for programming and community support

c++ - 如何在 C++ 中将窗口的屏幕截图作为位图对象?

java - 解密结果不一致

java - 随机生成形状和颜色并绘制到 Canvas 上

java - 从JSONarray中获取具体值

java - 如何有效地搜索返回数组列表中键的所有值

java - 如何将对象数组转为自定义类型数组(涉及ArrayList)

java - 如何计算列表中具有相同属性之一的自定义对象的数量

emacs - 在 emacs 中拆分缓冲区后如何切换焦点?

java - 如何使光标停留在窗口的某个区域