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

+ Recent posts