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

Java 从每个循环的内部移除ArrayList的元素时。它打破了循环,java,arraylist,foreach,Java,Arraylist,Foreach,从foreach循环内部删除ArrayList的元素时。它打破了循环。 抛出ConcurrentModificationException 我的问题是为什么它打破了循环 代码 ArrayList gStudyLst=getLst(); int recordCount=0; for(String study : gStudyLst){ if(++recordCount < 10){ if(generateFile(study)){

foreach
循环内部删除
ArrayList
的元素时。它打破了循环。
抛出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;
        }   
    }
ArrayList gStudyLst=getLst();
int recordCount=0;
用于(字符串研究:gStudyLst){
如果(++记录计数<10){
if(生成文件(研究)){
gStudyLst.remove(study);//这里有它的break-throw-ConcurrentModificationException
}否则{
System.out.println(“未生成文件”):
gStudyLst.clear();
返回false;
}
}
}否则{
返回true;
}   
}
用于避免ConcurrentModificationException

迭代器
接口的Java文档说:

迭代器允许调用方从基础结构中删除元素 使用定义良好的语义在迭代期间收集

以下是一个例子:

Iterator<String> iter = myArrayList.iterator();

while (iter.hasNext()) {
    String str = iter.next();

    if (someCondition)
        iter.remove();
}
迭代器iter=myArrayList.Iterator(); while(iter.hasNext()){ String str=iter.next(); 如果(某些条件) iter.remove(); } 用于避免ConcurrentModificationException

迭代器
接口的Java文档说:

迭代器允许调用方从基础结构中删除元素 使用定义良好的语义在迭代期间收集

以下是一个例子:

Iterator<String> iter = myArrayList.iterator();

while (iter.hasNext()) {
    String str = iter.next();

    if (someCondition)
        iter.remove();
}
迭代器iter=myArrayList.Iterator(); while(iter.hasNext()){ String str=iter.next(); 如果(某些条件) iter.remove(); } 这是因为该类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候以任何方式(除迭代器自己的remove或add方法外)修改列表的结构,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不会在将来的不确定时间冒任意、不确定行为的风险。”

有关详细信息,请参阅。

这是因为“该类的迭代器和listIterator方法返回的迭代器故障很快:如果在创建迭代器后的任何时间,以迭代器自己的remove或add方法以外的任何方式对列表进行结构修改,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不会在将来的不确定时间冒任意、不确定行为的风险。”


有关详细信息,请参阅。

for each循环仅用于遍历arraylist的值。如果要删除循环中的值,请使用如下所示的迭代器

for (Iterator iterator = gStudyLst.iterator(); iterator.hasNext();) {
            String study = (String) iterator.next();

}

for each循环仅用于遍历arraylist的值

for (Iterator iterator = gStudyLst.iterator(); iterator.hasNext();) {
            String study = (String) iterator.next();

}

增强型for语句的形式如下:

(类型标识符:表达式)语句的


增强型for语句相当于以下形式的基本for语句:

for(I iter=Expression.iterator();iter.hasNext();){
类型标识符=iter.next();
陈述
}
从javaDoc:

这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException


因此,不要使用
forEach
而是使用
Iterater
并使用迭代器自己的remove或add方法修改列表。

增强型for语句的形式如下:

(类型标识符:表达式)语句的


增强型for语句相当于以下形式的基本for语句:

for(I iter=Expression.iterator();iter.hasNext();){
类型标识符=iter.next();
陈述
}
从javaDoc:

这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException


因此,不要使用
forEach
使用
Iterater
并使用迭代器自己的remove或add方法修改列表。

是的,您需要使用iterator.remove()或索引的remove。是的,您需要使用iterator.remove()或索引的remove。iter.remove()可以从myArrayList中删除元素吗?@Pawanmishra:可以。iter.remove()可以从myArrayList中删除元素吗?@Pawanmishra:可以。