0

好的,我试图将一些学生对象添加到链接列表中,但我不允许使用链接列表的 .add 方法,所以当用户调用 removeStudent 方法时,他们输入学生 ID 号,然后检查列表对于具有该数组的对象

这是我添加方法的代码:

public void deleteStudent(int studentID)
{
    while (iter.hasNext())
    {
       Student ob = iter.next();
       if (ob.getStudentID() == studentID)
       {
         iter.remove();
         break;
       }
     }
  }

当我运行这个我得到这个错误:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953)
    at java.util.LinkedList$ListItr.next(LinkedList.java:886)
    at student.Registry.deleteStudent(Registry.java:30)
    at student.Registry.main(Registry.java:51)
Java Result: 1
4

3 回答 3

3

ConcurrentModificationException基本上意味着您在创建列表迭代器和使用它之间修改了列表。您需要做的是在将所有内容添加到列表或通过任何其他方式对其进行修改之后创建和使用迭代器。

于 2013-03-20T19:01:21.273 回答
0

编辑:尝试使用本地迭代器:

public void deleteStudent(int studentID){
  Iterator<Student> iterator=listStudent.iterator();
  while (iter.hasNext()){
    Student ob = iterator.next();
    if (ob.getStudentID() == studentID){
      iterator.remove(student);
      break;
    }
  }
}

这样,列表和您的本地迭代器之间就没有并发修改。但这会修改​​列表,如果您在调用此方法后继续尝试使用以前的迭代器,您可能会遇到问题。

编辑: AbstractList 维护一个“modCount”(修改计数)属性,该属性计算您在列表中添加、删除等的数量。

当您在 List 上获取迭代器时,迭代器会记住此 modCount 以确保您不会使用迭代器之外的方法编辑列表。

例子:

List myList=new ArrayList();
//modCount for the list is 0

myList.add("test");
//modCount for the list is 1

Iterator iterator=myList.iterator();
//modCount for the list is 1
//expected modCount for the iterator is initialized to 1

myList.add("test 2");
//modCount for the list is 2
//expected modCount for the iterator is initialized to 1

iterator.remove("test");
//modCount != expectedModCount => throw new ConcurrentModificationException()
于 2013-03-20T18:58:11.117 回答
0

您的原始任务不清楚,但看起来您受到 LinkedList API 的限制。

没有别的了。

使用链表删除(和一般修改)元素并不是一件容易的事——您可能必须安全地遍历整个列表。(关于链表的好消息是插入很容易)。

这将起作用(也有其他方法可以做到):

public void deleteStudent(int studentID){
...
  LinkedList<Student> modifiedStudentList = new LinkedList<>();
  while (iter.hasNext()){
    Student ob = iterator.next();
    if (ob.getStudentID() != studentID){
        modifiedStudentList.addLast(ob) 
    }
  }
  studentList = modifiedStudentList;
}

结果,您的列表将包含它以前拥有的所有学生,除了具有 studentID 的学生,如果它不存在于列表中,则不会删除任何内容。

您将不得不遍历集合中的所有元素,但这是您的老师设置的 API 限制的代价。

于 2013-03-20T19:58:16.183 回答