java.util.ConcurrentModificationException有人能解释一下这其中的逻辑原因吗
我正在创建一个类调用student,希望将它们存储在列表中我正在使用迭代器从列表中获取元素,但我不能这样做,因为正在发生异常,并且我无法解决此处发生的异常,如果有人能给我提供这方面的逻辑原因,那将非常有帮助。谢谢java.util.ConcurrentModificationException有人能解释一下这其中的逻辑原因吗,java,collections,exception-handling,Java,Collections,Exception Handling,我正在创建一个类调用student,希望将它们存储在列表中我正在使用迭代器从列表中获取元素,但我不能这样做,因为正在发生异常,并且我无法解决此处发生的异常,如果有人能给我提供这方面的逻辑原因,那将非常有帮助。谢谢 import java.awt.List; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.
import java.awt.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
import java.util.List.*;
public class Runs {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// adding student class to list
java.util.List list = new ArrayList<Student>();
Student q = new Student("hello", 1);
Iterator<Student> l = list.iterator();
list.add(q);
// error false in this segment of the code
Student op = l.next();
String hhh = op.getnamez();
System.out.println(hhh);
System.out.println(op.getnamez());
} catch (Exception e) {
System.out.println("" + e);
}
}
public static class Student {
// student class
public String name;
private int age;
public Student(String s, int a) {
this.name = s;
this.age = a;
}
public String getnamez() {
return this.name;
}
}
}
导入java.awt.List;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.Iterator;
导入java.util.Vector;
导入java.util.List.*;
公开课{
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
试一试{
//将学生类添加到列表中
java.util.List List=new ArrayList();
学生q=新生(“你好”,1);
迭代器l=list.Iterator();
列表。添加(q);
//此代码段中出现错误false
学生op=l.next();
字符串hhh=op.getnamez();
系统输出打印LN(hhh);
System.out.println(op.getnamez());
}捕获(例外e){
系统输出打印项次(“+e”);
}
}
公立静态班学生{
//学生班
公共字符串名称;
私人互联网;
公立学生(字符串s,整数a){
this.name=s;
这个年龄=a;
}
公共字符串getnamez(){
返回此.name;
}
}
}
Java集合类是快速失败的,这意味着如果某个线程使用迭代器遍历集合时该集合将被更改,迭代器.next()
将抛出ConcurrentModificationException。在多线程和单线程java编程环境中都可能出现并发修改异常
在您的示例中,一旦行list.add(q)代码>被执行,它更改迭代器的modCount
属性
modCount
提供更改列表大小的次数modCount
值用于每个迭代器。next()
调用检查函数中的任何修改checkForComodification
()
因此,它发现要更改modCount,并抛出ConcurrentModificationException
因此,如果您仍然希望对运行iTroTir的列表进行并发修改,您可能需要粘贴不同的数据结构,如CopyOnWriteArrayList,以替代列表可能的正确副本。虽然它也可以出现在多线程程序中,但在我所看到的几乎所有情况下(这里是如此),简单的单线程程序都存在问题。异常名称中的并发对某些人来说可能有点混乱。非常感谢您的解释@mhasan先生!!!我真的理解了代码段上发生的事情。再次感谢:)