前言:
出現這個異常,一般就是在遍歷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。
總結:
我是阿達,一名喜歡分享知識的程序員,時不時的也會荒腔走板的聊一聊電影、電視劇、音樂、漫畫,這裏已經有六位小夥伴在等你們啦,感興趣的就趕緊來點擊關注我把,哪裏不明白或有不同觀點的地方歡迎留言。