728x90
for-each문을 돌리면서 조건에 맞으면 리스트의 요소를 삭제해주는 부분에서 java.util.ConcurrentModificationException이라며 런타임 에러가 났다.
오류난 부분의 코드는 다음과 같다.
이 에러는 딱 보자마자 원인이 짐작이 갔다.
예를 들어 처음에 list라는 리스트의 크기가 10이었다고 하자.
그러면 for-each문은 인덱스 0부터 9까지 반복하면서, 즉 list.get(0)부터 list.get(9)까지 반복하면서 일을 처리할 것이다.
그런데 인덱스 4에서 조건이 맞아서 list.get(4)를 삭제하면 이제 리스트의 크기는 9가 되고 마지막 원소는 list.get(8)이 된다. 그런데 list.get(9)를 하려고 하니까 인덱스의 범위를 넘어서면서 문제가 발생하는 것이다.
이 문제는 다음과 같은 방법으로 해결이 가능하다.
int size = list.size();
for(int i = 0; i < size(); i++)
for-each문이 아닌 for문을 직접 돌리는데 i < list.size()까지가 아니라 size라는 변수를 선언하고 i < size까지 돌린다.
if문에 해당되어 원소를 지운 경우는 i와 size를 하나씩 줄여준다.
int size = list.size();
for(int i = 0; i < size; i++) {
리스트의 타입 element = list.get(i);
if(조건) {
list.remove(element);
size--;
i--;
}
}
이렇게 말이다.
그러면 에러가 해결된다.
728x90