好的,我试图将一些学生对象添加到链接列表中,但我不允许使用链接列表的.add方法,所以当用户调用removeStudent方法时,他们输入sutdents 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
答案 0 :(得分:3)
ConcurrentModificationException
基本上意味着您已经在创建列表迭代器和使用它之间修改了列表。您需要做的是在将所有内容添加到列表后创建并使用迭代器,或者通过任何其他方式对其进行修改。
答案 1 :(得分: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()
答案 2 :(得分: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限制的价格。