从ArrayList
循环内删除foreach
元素时。它打破了循环。
throw ConcurrentModificationException
我的问题是为什么它打破了循环。
代码。
ArrayList gStudyLst=getLst();
int recordCount=0;
for(String study : gStudyLst){
if(++recordCount < 10){
if(generateFile(study)){
gStudyLst.remove(study); // there its break throw ConcurrentModificationException
}else{
System.out.println("File not generated"):
gStudyLst.clear();
return false;
}
}
}else{
return true;
}
}
答案 0 :(得分:4)
使用Iterator来避免 ConcurrentModificationException 。
Iterator
界面的Java文档说:
迭代器允许调用者从底层删除元素 在迭代期间使用明确定义的语义进行收集。
以下是一个例子:
Iterator<String> iter = myArrayList.iterator();
while (iter.hasNext()) {
String str = iter.next();
if (someCondition)
iter.remove();
}
答案 1 :(得分:2)
这是因为&#34;这个类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的删除或添加方法,迭代器将抛出一个ConcurrentModificationException。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来的未确定时间冒着任意的,非确定性行为的风险。&#34;
有关详细信息,请参阅http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html。
答案 2 :(得分:0)
仅用于遍历arraylist的值。如果要删除循环内的值,请使用迭代器,如下所示
for (Iterator iterator = gStudyLst.iterator(); iterator.hasNext();) {
String study = (String) iterator.next();
}
答案 3 :(得分:0)
增强的for语句具有以下形式:
for ( Type Identifier : Expression ) Statement
增强的for语句相当于表单的基本for语句:
for (I iter = Expression.iterator(); iter.hasNext(); ) {
Type Identifier = iter.next();
Statement
}
来自javaDoc:
此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出一个ConcurrentModificationException
所以不要使用forEach
使用Iterater
而是使用迭代器自己的remove或add方法修改List。