ConcurrentModificationException trong Java là gì?
Ví dụ
Hãy xem một ví dụ về cách ngoại lệ này xảy ra.import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver1 {
public static void main(String[] args) {
List<String> businessDays = new ArrayList<>();
businessDays.add("Monday");
businessDays.add("Tuesday");
businessDays.add("Wednesday");
businessDays.add("Thursday");
businessDays.add("Friday");
businessDays.add("Saturday");
businessDays.add("Sunday");
Iterator<String> iterator = businessDays.iterator();
while (iterator.hasNext()) {
String day = iterator.next();
if (day.equals("Sunday")) {
// removing a list item while iterating
// leading to java.util.ConcurrentModificationException
businessDays.remove(day);
}
}
}
}
đầu ra
Ngoại lệ trong luồng "chính" java.util.ConcurrentModificationException
tại java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
tại java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
tại
Milestone.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)
Làm cách nào để tránh ConcurrentModificationException trong Java?
Có nhiều cách giải quyết khác nhau cho ConcurrentModificationException . Dưới đây là nhập ngũ một số. Bạn có thể lựa chọn bất cứ ai theo nhu cầu của bạn.- Tránh sửa đổi trong khi lặp lại.
- Sử dụng các vòng lặp truyền thống để lặp lại và sửa đổi đồng thời.
- Tạo bản sao của các giá trị cần sửa đổi trong khi sử dụng trình vòng lặp. Cập nhật các giá trị sau khi quá trình lặp kết thúc.
Ví dụ
Đây là ví dụ về cách bạn có thể tránh ConcurrentModificationException .import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver2 {
public static void main(String[] args) {
List<String> businessDays = new ArrayList<>();
businessDays.add("Monday");
businessDays.add("Tuesday");
businessDays.add("Wednesday");
businessDays.add("Thursday");
businessDays.add("Friday");
businessDays.add("Saturday");
businessDays.add("Sunday");
System.out.println("Initial Business Days: " + businessDays);
// Method II - Using traditional for loop
for (int i = 0; i < businessDays.size(); i++) {
if (businessDays.get(i).equals("Sunday")) {
businessDays.remove(i);
}
}
Iterator<String> iterator = businessDays.iterator();
List<String> businessDaysToBeRemoved = new ArrayList<>();
// Method III - Creating a copy of elements
while (iterator.hasNext()) {
String day = iterator.next();
if (day.equals("Saturday")) {
// Add values to be removed in the list
businessDaysToBeRemoved.add(day);
}
}
businessDays.removeAll(businessDaysToBeRemoved);
System.out.println("Final Business Days: " + businessDays);
}
}
đầu ra
Ngày làm việc ban đầu: [Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu, Thứ Bảy, Chủ Nhật]
Ngày làm việc cuối cùng: [Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu]
GO TO FULL VERSION