Java java.util.ConcurrentModificationException 처리

2024. 11. 30. 07:42Java

Collection(List, Set, Map 등)을 반복중에 구조적 변경을 할 경우, 예외가 발생함

예외 발생 예

// 순환하는 중에 요소 등록하는 경우
import java.util.ArrayList;
import java.util.Iterator;

public class ConcurrentModificationDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        for (String item : list) {
            if ("B".equals(item)) {
                list.add("D"); // Structural modification during iteration
            }
        }
    }
}

// 순환하는 중에 요소 삭제하는 경우
import java.util.ArrayList;
import java.util.Iterator;

public class ConcurrentModificationDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String item = iterator.next();
            if ("B".equals(item)) {
                list.remove(item); // Structural modification during iteration
            }
        }
    }
}

처리 방법 1

import java.util.ArrayList;
import java.util.Iterator;

public class SafeModification {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String item = iterator.next();
            if ("B".equals(item)) {
                iterator.remove(); // Safe removal
            }
        }
        System.out.println(list); // Output: [A, C]
    }
}

처리방법 2

ArrayList<String> copyList = new ArrayList<>(list);
for (String item : copyList) {
    if ("B".equals(item)) {
        list.remove(item); // Modify the original list safely
    }
}