ConcurrentModificationException (Java SE 19 & JDK 19)
발생
다음과 같은 코드가 있다고 하자.
TreeSet을 사용하였으며, 값이 중복되지 않게 들어가며, item 값이 오름차순으로 출력된다.
원하는 출력은 중복이 포함되지 않으므로 2, 3, 5 순서대로 개행되면서 출력되는 것이다.
import java.util.TreeSet;
public class ExceptionTest {
public static void main(String[] args) {
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(3);
treeSet.add(2);
treeSet.add(5);
for (int item : treeSet) {
System.out.println(item);
}
}
}
위 코드의 출력 결과를 보자
2
3
5
위 같은 코드에서는 문제가 없다.
다음 코드를 보자
import java.util.TreeSet;
public class ExceptionTest {
public static void main(String[] args) {
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(3);
treeSet.add(2);
treeSet.add(5);
for (int item : treeSet) {
System.out.println(item);
if (item == 3) {
treeSet.add(6);
}
}
}
}
위 코드는 treeSet의 원소를 돌면서, item 값이 3이라면 treeSet에 6을 추가하는 코드이다.
하지만 위 코드를 실행하면 다음과 같은 Exception이 발생한다.
2
3
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1208)
at java.base/java.util.TreeMap$KeyIterator.next(TreeMap.java:1262)
at ExceptionTest.main(ExceptionTest.java:12)
ConcurrentModificationException이 발생한다.
이는 현재 treeSet for each 문을 돌면서 Iterator가 생성되었을 때 treeSet에 추가하는 연산이 일어나 오류가 생기는 것이다.
이는 Tree형 자료구조에서 발생하며, keySet() 메소드를 호출해도 똑같이 Iterator가 생성되기 때문에 주의해야 할 필요가 있다.
'Programming > [Java]' 카테고리의 다른 글
문자열 합치기 (2) | 2023.01.25 |
---|---|
Java 이클립스 톰캣 서버 연결 (0) | 2021.09.03 |
GUI Java 오목 프로그램 (2) | 2021.07.20 |