我有ClassA,它有一个静态的ArrayList of Objects
public static ArrayList<Meteorit> meteorits = new ArrayList<Meteorit>();
现在我想从此列表中删除一个对象
ClassA.meteorits.remove(this);
这是用Meteorit类编写的。但是当我想使用ArrayList中的对象时,它会引发异常。
Exception in thread "LWJGL Application" java.util.ConcurrentModificationException
我使用Iterator从ArrayList中删除对象,但现在我不知道在这种情况下如何使用它。
答案 0 :(得分:2)
这是因为某个线程实际上是在每个循环中查看此列表,也许您尝试在每个循环中删除此列表的元素?你不能删除每个中的元素,但你可以在迭代器循环中删除:
您可以使用迭代器代替每个迭代器来删除和查看列表中的元素,如下所示:
public static ArrayList<Meteorit> meteorits = new ArrayList<Meteorit>();
Iterator<Meteorit> itr = meteorits.iterator();
while (itr.hasNext()) {
if (itr.next()==this) {
itr.remove();
}
}
答案 1 :(得分:1)
使用迭代器时;您需要使用迭代器从列表中删除项目:
iterator.remove();
来自Java Docs的说:
从底层集合中移除此迭代器返回的最后一个元素。
通过任何其他方式从列表中删除项目将导致您看到的ConcurrentModificationException。
答案 2 :(得分:1)
基本上,您需要使用迭代器来避免这种并发修改:
List<String> list = new ArrayList<>();
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
有关详细信息,请查看此帖:
Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop
答案 3 :(得分:0)
Iterator<Integer> itr = yourlist.iterator();
// remove all even numbers
while (itr.hasNext()) {
itr.remove();
}
这一定对您有用,解决此问题的其他方法是使用CopyOnWriteArrayList,希望它有所帮助。