前言:
出现这个异常,一般就是在遍历ArrayList删除元素时会出现这个异常,这篇文章讲解下怎么解决这个问题。
正文:
1.我先复现下出现这个bug的情景,代码如下
@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {
private String name;
private String id;
}
class ArrayListDelete {
public static void main(String[] args) {
Student student = new Student("小明", "1");
Student student1 = new Student("小明", "2");
Student student2 = new Student("小明", "3");
ArrayList<Student> students = new ArrayList<>();
students.add(student);
students.add(student1);
students.add(student2);
for (Student s : students) {
if (s.getId().equals("1")) {
students.remove(s);
}
}
System.out.println(students.toString());
}
}
运行这个代码就会出现文章提到的这个错误java.util.ConcurrentModificationException,如下图
2.出现这个异常的原因是,在对集合ArrayList遍历时,调用了list.remove()方法,具体原因需要看源码才可以理解,源码分析传送门:https://blog.csdn.net/androidboy365/article/details/50540202/
3.解决方案就是不要用for-each遍历,换成迭代器遍历,并且不要用list.remove()方法移除对象,用迭代器的方法iterator.remove()移除对象,具体看下面的代码:
class ArrayListDelete {
public static void main(String[] args) {
Student student = new Student("小明", "1");
Student student1 = new Student("小明", "2");
Student student2 = new Student("小明", "3");
ArrayList<Student> students = new ArrayList<>();
students.add(student);
students.add(student1);
students.add(student2);
Iterator<Student> iterator = students.iterator();
while (iterator.hasNext()){
Student next = iterator.next();
if(next.getId().equals("1")){
iterator.remove();
}
}
System.out.println(students.toString());
}
}
执行结果,这样就解决了这个异常ConcurrentModificationException。
总结:
我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有六位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里不明白或有不同观点的地方欢迎留言。