我正在尝试我的大学课程的一些代码,并将方法从
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;
}至:
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);
}但新方法总是给出并发修改错误。我如何解决这个问题?为什么会发生这种情况?
发布于 2013-03-13 19:52:18
这是因为您在执行remove()之后会继续遍历列表。
您同时读取和写入列表,这破坏了foreach循环底层迭代器的契约。
使用Iterator.remove()
for(Iterator<Student> iter = students.iterator(); iter.hasNext(); ) {
Student student = iter.next();
if(studentName.equalsIgnoreCase(student.getName()) {
iter.remove();
}
}它的描述如下:
返回迭代中的下一个元素。
如果迭代没有更多的元素,则抛出NoSuchElementException。
您可以使用Iterator.hasNext()检查是否有下一个元素可用。
发布于 2013-03-13 19:53:45
foreach构造使用底层Iterator。
在第二种方法中,即使从列表中删除了一项,您也可以继续迭代。这将导致您看到的异常。看一看取自ConcurrentModificationException文档的这句话:
例如,当一个线程正在迭代集合时,通常不允许另一个线程修改集合。通常,在这些情况下,迭代的结果是未定义的。如果检测到此行为,某些迭代器实现(包括由JRE提供的所有通用集合实现的实现)可能会选择抛出此异常。
发布于 2013-03-13 19:53:26
不允许在迭代元素时从集合中移除该元素。迭代器在使用过程中检测到结构变化,并抛出异常。许多集合都是以这种方式实现的。
直接使用迭代器:
Iterator<Student> it = students.iterator();
while (it.hasNext()) {
Student student = it.next();
if (studentName.equalsIgnoreCase(student.getName())) {
it.remove();
return true;
}
}
return false;https://stackoverflow.com/questions/15384486
复制相似问题