가자미의 개발이야기

[에러] java.util.ConcurrentModificationException 본문

Java

[에러] java.util.ConcurrentModificationException

가자미 2021. 7. 24. 12:27

평화로운 토요일 오전... 알바를 하며 자바 공부를 하고 있었다.

 

내가 쓴 코드를 보자.

public class Ch1 {
    //using predicate!
    public static List<Player> filterPlayer(List<Player> list, playerPredicate p) {
        List<Player> result = new ArrayList<>();
        for (Player i : list) {
            if (p.test(i)) {
                list.add(i);
            }
        }
        return result;
    }
    public static void printPlayer(List<Player> list){
        for(Player i : list){
            System.out.println(i);
        }
    }
    public static void main(String[] args){
        List<Player> list = new ArrayList<>();
        list.add(new Player(20, 15, "PG"));
        list.add(new Player(30, 25, "SG"));
        list.add(new Player(50, 45, "CT"));

        List<Player> result = filterPlayer(list, new cheapPlayer());
        printPlayer(list);

    }
}

프레디케이트를 활용한 동적 파라미터 전달하는 예제의 일부다.

 

실행을 시켜봤더니.. 다음과 같은 에러가 발생했다.

언뜻 보니 arraylist부분에서 발생한거 같다.

에러 메시지의 역순으로 찾아가보니, 

List<Player> result = filterPlayer(list, new cheapPlayer());에서 문제가 발견됐고,

filterPlayer 메소드의 반복문 블록에서 문제가 발생했다.

 

그러면 이쯤에서 ConcurrentModificationException에 대해 알아보자.

이 에러는 어떤 컬렉션에서 반복문을 돌고 있는데, 반복 중에 컬렉션의 요소를 제거하거나 추가하려고 하면 생기는 문제다!!!

 

이번 예시에서는 list.add(i)가 아니라 result.add(i)를 해야 문제가 해결된다!!

'Java' 카테고리의 다른 글

객체지향에 대해 간략한 정리  (0) 2021.07.26