Java 在getter中添加到ArrayList时的ConcurrentModificationException

Java 在getter中添加到ArrayList时的ConcurrentModificationException,java,list,arraylist,concurrency,concurrentmodification,Java,List,Arraylist,Concurrency,Concurrentmodification,下面的代码给出了ConcurrentModificationException,特别是转义行,我想知道为什么。 我发现,当迭代器被提取后添加到列表中,或者当两个线程同时访问列表时,就会发生这种情况。然而,我不认为我的例子是这样的 我所做的是将GameObjects列表作为参数传递: camera.render(g, map.getGameObjectHandler().getGameObjects()); 吸气剂: public ArrayList<GameObject>

下面的代码给出了ConcurrentModificationException,特别是转义行,我想知道为什么。 我发现,当迭代器被提取后添加到列表中,或者当两个线程同时访问列表时,就会发生这种情况。然而,我不认为我的例子是这样的

我所做的是将GameObjects列表作为参数传递:

camera.render(g, map.getGameObjectHandler().getGameObjects());
吸气剂:

    public ArrayList<GameObject> getGameObjects() {
//          if (player != null) {
//              gameObjects.add(player);
//          }
        return this.gameObjects;

ArrayList上的ConcurrentModificationException可能在以下情况下发生:

  • 部分代码正在迭代和修改列表
  • 当另一个线程在列表上迭代时,会出现诸如添加/删除之类的并发修改

在以下情况下,ArrayList上可能发生ConcurrentModificationException:

  • 部分代码正在迭代和修改列表
  • 当另一个线程在列表上迭代时,会出现诸如添加/删除之类的并发修改

迭代器正在迭代时,您是否正在添加到列表中?可能就是这个问题。如果您提供一些添加播放器的代码,可能会更清楚。您还可以在
ArrayList
AbstractList
类中的任何地方放置一些断点,当您迭代集合并对其进行修改时,
ConcurrentModificationException
会引发
ConcurrentModificationException
。这很直截了当,没有例外。要么不这样做,要么复制一份集合进行迭代。你在哪里将玩家添加到列表中?这是在另一个线程中完成的吗?您需要向我们显示更多代码以提供帮助。您是在迭代器迭代时添加到列表中的吗?可能这就是问题所在。如果您提供一些添加播放器的代码,可能会更清楚。您还可以在
ArrayList
AbstractList
类中的任何地方放置一些断点,当您迭代集合并对其进行修改时,
ConcurrentModificationException
会引发
ConcurrentModificationException
。这很直截了当,没有例外。要么不这样做,要么复制一份集合进行迭代。你在哪里将玩家添加到列表中?这是在另一个线程中完成的吗?你需要展示更多的代码来帮助我们。请看一下主要的帖子。在更新2下,我发布了我使用列表的地方,我认为问题就在那里。因为这两个调用都是一个接一个地执行的,所以我认为这样做可以逃脱惩罚。这个问题的可能解决方案是什么?也许为render方法创建一个arraylist的副本?你能试着给它传递一个不可变的列表(来自guava)看看它是否中断了吗?如果是,则render()调用将改变列表。如果没有,那么您可以通过多线程访问此列表。请看一看主帖子。在更新2下,我发布了我使用列表的地方,我认为问题就在那里。因为这两个调用都是一个接一个地执行的,所以我认为这样做可以逃脱惩罚。这个问题的可能解决方案是什么?也许为render方法创建一个arraylist的副本?你能试着给它传递一个不可变的列表(来自guava)看看它是否中断了吗?如果是,则render()调用将改变列表。如果没有,则您可以通过多线程访问此列表。
map.update(); // iterating over the list and calling methods of objects in 
              // the list [running in main game thread]

repaint(); // calling paintComponentMethod where we pass our list as an 
           // argument so all its content can be drawn [running in event-
           // dispatch-thread !?]`