我目前正在使用 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()
替换为size
。 size
是一个变量,当添加、删除、清除列表或仅删除敌人时,该变量会发生变化。
此方法确实 100% 有效,窗口拖动不会使使用此方法的程序崩溃。
问题
综上所述,最后一个问题是为什么会出现这种情况?我还没有确定为什么拖动窗口并使用 ArrayList 的 size() 方法会导致程序崩溃,但在其位置存储变量却完全没问题。
非常感谢对这种奇怪现象的任何帮助或解释:)
编辑 最后一次编辑被证明是不正确的,即使使用了大小变量,程序仍然崩溃,是时候回到绘图板了......
编辑两个 好的,所以有时窗口拖动有效,有时则无效,这可能不仅仅是简单的 size() 方法调用:/
最佳答案
根据您提供的信息,我猜测多个线程正在同时访问 ArrayList,并且这些线程正在践踏所有其他线程。
如果您不通过 Collections.synchronizedList() 创建列表,以保证列表上的所有操作都是原子的,以便数组的内部结构不会损坏。
我走这条路的原因是拖动 Windows 可能会生成多个事件来更新数组,并且您试图同时迭代它。
当您使用变量来观察大小时,并发问题就会消失。当然,除非您使用 AtomicInteger 或其他什么,否则您可能在变量中没有正确的值,但至少不会引发异常。
关于java - ArrayList size() 方法导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36707040/