Java 对象ArrayList的并发修改错误
我一直在寻找我的问题的答案,但什么也没用。 这是我的密码Java 对象ArrayList的并发修改错误,java,concurrentmodification,Java,Concurrentmodification,我一直在寻找我的问题的答案,但什么也没用。 这是我的密码 public ArrayList<Exercise> checkList() { Criteria a = this.getCriteria(); ArrayList<Exercise> z = this.getExercise(); for(Exercise c : z) { if(!compareSkillLevel(c,a)|| !compareEquipmen
public ArrayList<Exercise> checkList()
{
Criteria a = this.getCriteria();
ArrayList<Exercise> z = this.getExercise();
for(Exercise c : z)
{
if(!compareSkillLevel(c,a)|| !compareEquipment(c)|| !compareFocus(c)
|| !compareTraining(c))
z.remove(c);
}
return z;
}
如何解决此问题?在迭代时删除,这会导致此异常。
要解决此问题,请使用
迭代器(ListIterator)
并调用Iterator.remove()
for(Iterator it=z.Iterator();it.hasNext();){
练习e=it.next();
如果(条件){
z、 删除();
}
}
正如其他答案所指出的,这里的问题是,在迭代列表时,试图从列表中删除。这在java中是不允许的,除非您使用迭代器的remove方法删除元素。这意味着您有两种方法来修复此代码
1:
for(迭代器迭代器=z.Iterator();迭代器.hasNext();)
{
练习c=迭代器.next();
如果(!compareSkillLevel(c,a)| |!compareEquipment(c)| |!compareFocus(c)
||!比较训练(c))
iterator.remove();
}
或者,您可以使用数组列表的索引在其上循环,并执行以下操作
2:
for(int i=0;i
请注意此处的i--
,这是必要的,因为从ArrayList
中删除元素的操作会转移现有元素,这意味着您要检查的下一个元素将取代上一个元素。请问如何解决此问题?请在提出新问题之前搜索StackOverflow。只需搜索ConcurrentModificationException
就会得到很多结果。这解决了我的问题,谢谢
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at randomworkout.List.checkList(List.java:161)
at Main.main(Main.java:46)
for (Iterator<Excercise> it = z.iterator(); it.hasNext();) {
Excercise e = it.next();
if (condition) {
z.remove();
}
}
for(Iterator<Exercise> iterator = z.iterator(); iterator.hasNext();)
{
Exercise c = iterator.next();
if(!compareSkillLevel(c,a)|| !compareEquipment(c)|| !compareFocus(c)
|| !compareTraining(c))
iterator.remove();
}
for(int i = 0;i < z.size(); i++)
{
Exercise c = z.get(i);
if(!compareSkillLevel(c,a)|| !compareEquipment(c)|| !compareFocus(c)
|| !compareTraining(c))
z.remove(i--)
}