Java에서 ConcurrentModificationException이란 무엇입니까?
예
이 예외가 어떻게 발생하는지 예를 살펴보겠습니다.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);
}
}
}
}
산출
java.base/java.util.ArrayList$Itr.next(ArrayList.java)의 java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)에서 스레드 "main" java.util.ConcurrentModificationException의 예외 :996) 마일스톤.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)
Java에서 ConcurrentModificationException을 방지하는 방법은 무엇입니까?
ConcurrentModificationException 에 대한 해결 방법은 다양합니다 . 여기에 몇 가지가 입대되었습니다. 귀하의 필요에 따라 누구든지 선택할 수 있습니다.- 반복하는 동안 수정을 피하십시오.
- 동시 반복 및 수정을 위해 기존 루프를 사용합니다.
- 반복자를 사용하는 동안 수정할 값의 복사본을 만듭니다. 반복이 끝나면 값을 업데이트합니다.
예
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);
}
}
산출
최초영업일 : [월,화,수,목,금,토,일] 최종영업일 : [월,화,수,목,금]
GO TO FULL VERSION