티거의 개발 공간

java.util.ConcurrentModificationException

이 예외는 흔히 List나 ArrayList를 for 문에 직접 집어넣고 돌리며 remove를 호출했을 때 발생한다.

1
2
3
4
5
6
ArrayList<String> list = new ArrayList<String>();
//~ ~ ~        
for(String name : list){
    list.remove(name);
}
 
cs

 

 위의 메서드를 실행할 때 예외가 발생한다는 건데,

위의 for 문은 list에서 index를 비교하며 그에 맞는 값을 name에 넣어주고 돌리는 식이다.
그런데 돌리는 도중 remove를 호출하면 기존 index 값과 remove 호출로 인해 줄어든 size 값이 맞지 않기 때문에 예외가 발생한다. 

 


 

해결법 [1]

 

1
2
3
4
5
6
7
8
9
ArrayList<String> list = new ArrayList<String>();
~ ~ ~
            
ArrayList<String> Remove = new ArrayList<String>();
for (String name : list) 
    Remove.add(name);
for (String name : Remove) 
    list.remove(name);
 
cs

 

 위의 예외를 피하기 위해서 삭제해야 할 리스트(이하 Remove)를 따로 만들고, Remove를 for 문에 집어넣어 돌려 list를 제거하는 형식이다.

하지만 이 방법은 효율적이지 않으며 속도도 느리다고 한다.

 


 

 

해결법 [2]

 

 

1
2
3
4
5
6
7
8
9
ArrayList<String> list = new ArrayList<String>();
~ ~ ~
 
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String s = iter.next();
    iter.remove();
}
 
cs

 

 위의 방법은 반복자(Iterator)를 이용하는 방법이다.
.remove() 메서드보다 무조건 .next() 메서드가 먼저 호출되어야만 예외가 발생하지 않는다.
해결법 1보다는 이 방법이 더 효율적이고 쓸모없는 코드들이 없다 하니 이 방법을 많이 사용하는 것을 권장한다.

'Java > Java Note' 카테고리의 다른 글

자바 AES 암호화, 복호화  (0) 2017.04.02
자바 모래시계 알고리즘  (0) 2017.04.02
이클립스 테마 변경하기  (0) 2017.04.02
이클립스 기본인코딩 변경하기(UTF-8)  (0) 2017.04.01
자바 소켓통신하는법  (0) 2017.04.01