从内部为每个循环移除ArrayList的元素时。它打破了循环

时间:2014-03-11 06:05:45

标签: java arraylist foreach

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;
        }   
    }

4 个答案:

答案 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。

相关问题