자바 리스트 순회 도중 삭제로 인한 에러

안석우(문과대학 철학)·2024년 8월 23일
0

JAVA

목록 보기
8/11
        System.out.println(restaurant.getMenuRestaurants().size());
        for(MenuRestaurant menures:restaurant.getMenuRestaurants()){
            ms.delete(menures);
        }

이렇게 돌려놨더니

System.out.println(restaurant.getMenuRestaurants().size());

얘의 결과는 2인데 For문은 한 번돌고 빠져나오더라. 뭐가 문제일까 했는데 리스트를 돌다가 그 안의 원소를 삭제해버리니깐 발생하는 문제였다.

그래서 Iterator를 사용해서 해결하려 했다.

for (Iterator<MenuRestaurant> iterator = restaurant.getMenuRestaurants().iterator(); iterator.hasNext();) {
    MenuRestaurant menures = iterator.next();
    ms.delete(menures);
    iterator.remove();  // This removes the element from the collection safely
}

이랬더니 ConcurrentModificationException이 발생하더라.

list.remove(index)는 그 인덱스의 element를 삭제하고 index+1부터 나머지 element들을 한 칸씩 댕겨온다. remove메서드는 어떤 카운터 변수를 하나 증가시킨다.
향상된 for문은 while(list.iterator.hasNext()) 방식으로 리스트를 순회하는데 hasNext() 에서는 remove에서 증가시킨 카운터와 다른 카운터가 일치하는지를 보고, 일치하지 않으면 concurrentModificationException을 발생시킨다.

참고: https://m.blog.naver.com/tmondev/220393974518

그래서

List<MenuRestaurant> toRemove = new ArrayList<>();
for (MenuRestaurant menures : restaurant.getMenuRestaurants()) {
    toRemove.add(menures);
}

for (MenuRestaurant menures : toRemove) {
    ms.delete(menures);
    restaurant.getMenuRestaurants().remove(menures);
}

새로운 리스트를 만들어서 이를 해결해주었다.

0개의 댓글