ConcurrentModificationException: null

Yunny.Log ·2022년 5월 12일
1

Debugging

목록 보기
1/69
post-thumbnail
post-custom-banner

에러가 발생한 상황

  • 리스트를 순회하면서 내가 원하는 아이들만 collect 하는 중이었다.

  • 한 myList라는 리스트에서 서로 전혀 겹치지 않는 두가지 집단 1,2 를 추출하는 과정이었다.

  • 1: 첫번쨰 집단 ) 첫번째 조건을 만족시키는 아이들을 담아주었고, 이 아이들은 myList에서 제거해줌

  • 2: 두번쨰 집단 ** 여기서 에러 발생 ) 첫번째 집단이 제거된 myList(제일 큰 하늘색) 에서 두번째 집단 아이들을 뽑아주는 작업

에러가 발생한 코드

        //1-1 temp save 용 ) 내가 작성자인 모든 프로젝트들 데려오기
        List<Project> myProjectList = projectRepository.findByMember(member1);

        //1-2 temp-save 가 true 인 것만 담는 리스트
        List<Project> tempSavedProjectList = new ArrayList<>();

        for (Project project : myProjectList) {
            if (project.getTempsave()) {
                tempSavedProjectList.add(project);
                myProjectList.remove(project);
                //임시저장 진행 중인 것
            }
        }

        for(Project project: myProjectList){
            System.out.println("임시저장 끝나고 남음");
            System.out.println(project.getId());
        }

        //만약 이게 waiting approve 로 빠진다면 담아주는 리스트만 변경하면 된다.
        for (Project project : myProjectList) {
            if (!project.getTempsave()
                // 임시저장 되지 않은 애들 중에 아직 approve 받지 않은 것들
                    &&
                    !(routeProductRepository.findAllByProject(project).get(
                            routeProductRepository.findAllByProject(project).size()-1
                    ).isPassed())
                // 아직 approved 되지 않았다면
            ) {
                tempSavedProjectList.add(project);
                myProjectList.remove(project);

            }
        }

ConcurrentModificationException?

  • 해당 Exception 은 대부분 Collection 객체에 remove 메소드 호출 시 발생

    결론적으로 말하자면 엘리먼트의 인덱스가 실시간으로 변하기 때문에 발생하는 이벤트 입니다.

Length가 변경되면서 해당 인덱스의 값이 null 이 되기 때문에 발생하는 것이죠.
이를 해결하기 위해서는 Iterator를 사용하여야 하며,
itr.next() 의 remove가 아니라 itr 자체에 remove 를 해주셔야 합니다.

출처: https://aljjabaegi.tistory.com/533 [알짜배기 프로그래머]

post-custom-banner

0개의 댓글