首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发修改异常错误

问Java并发修改异常错误
EN

Stack Overflow用户
提问于 2013-03-13 19:49:59
回答 8查看 13K关注 0票数 10

我正在尝试我的大学课程的一些代码,并将方法从

代码语言:javascript
复制
public boolean removeStudent(String studentName)
{
    int index = 0;
    for (Student student : students)
    {
        if (studentName.equalsIgnoreCasee(student.getName()))
        {
            students.remove(index);
            return true;
        }
        index++;
    }
    return false;
}

至:

代码语言:javascript
复制
public void removeStudent(String studentName) throws StudentNotFoundException
{
    int index = 0;
    for (Student student : students)
    {
        if (studentName.equalsIgnoreCase(student.getName()))
        {
            students.remove(index);
        }
        index++;
    }
    throw new  StudentNotFoundException( "No such student " + studentName);
}

但新方法总是给出并发修改错误。我如何解决这个问题?为什么会发生这种情况?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-03-13 19:52:18

这是因为您在执行remove()之后会继续遍历列表。

您同时读取和写入列表,这破坏了foreach循环底层迭代器的契约。

使用Iterator.remove()

代码语言:javascript
复制
for(Iterator<Student> iter = students.iterator(); iter.hasNext(); ) {
    Student student = iter.next();
    if(studentName.equalsIgnoreCase(student.getName()) {
        iter.remove();
    }
}

它的描述如下:

返回迭代中的下一个元素。

如果迭代没有更多的元素,则抛出NoSuchElementException。

您可以使用Iterator.hasNext()检查是否有下一个元素可用。

票数 21
EN

Stack Overflow用户

发布于 2013-03-13 19:53:45

foreach构造使用底层Iterator。

在第二种方法中,即使从列表中删除了一项,您也可以继续迭代。这将导致您看到的异常。看一看取自ConcurrentModificationException文档的这句话:

例如,当一个线程正在迭代集合时,通常不允许另一个线程修改集合。通常,在这些情况下,迭代的结果是未定义的。如果检测到此行为,某些迭代器实现(包括由JRE提供的所有通用集合实现的实现)可能会选择抛出此异常。

票数 2
EN

Stack Overflow用户

发布于 2013-03-13 19:53:26

不允许在迭代元素时从集合中移除该元素。迭代器在使用过程中检测到结构变化,并抛出异常。许多集合都是以这种方式实现的。

直接使用迭代器:

代码语言:javascript
复制
    Iterator<Student> it = students.iterator();
    while (it.hasNext()) {
        Student student = it.next();

        if (studentName.equalsIgnoreCase(student.getName())) {
                it.remove();
                return true;
        }
    }
    return false;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15384486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档