我已经搜索了我的问题的答案但没有任何效果。 这是我的代码。
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;
}
运行此操作后,我得到了一个Conncurrent Modification Exeption。
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)
我该如何解决这个问题?
答案 0 :(得分:1)
正如其他答案所指出的,你在这里遇到的问题是你在迭代它时试图从列表中删除。除非使用迭代器的remove方法删除元素,否则java中不允许这样做。这意味着您有两种方法来修复此代码。
1:
for(Iterator<Exercise> iterator = z.iterator(); iterator.hasNext();)
{
Exercise c = iterator.next();
if(!compareSkillLevel(c,a)|| !compareEquipment(c)|| !compareFocus(c)
|| !compareTraining(c))
iterator.remove();
}
或者,您可以使用其索引遍历数组列表,而是执行类似
的操作2:
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--)
}
请注意这里的i--
,这是必要的,因为从ArrayList
移除元素的行为会将现有元素移位,这意味着您要检查的下一个元素位于最后一个元素的位置元件。
答案 1 :(得分:0)
您在迭代时删除,这会导致此异常
要解决问题,请使用Iterator
(ListIterator)
并致电iterator.remove()
for (Iterator<Excercise> it = z.iterator(); it.hasNext();) {
Excercise e = it.next();
if (condition) {
z.remove();
}
}