본문 바로가기
Java/Java with Error

[해결 방법] java.util.ConcurrentModificationException

by HJ0216 2023. 2. 16.

 기본 환경: IDE: Eclipse, Language: Java

 

 

발생 Exception

Java에서 다음 Source Code를 실행할 경우,

public class SungJukDelete_T implements SungJuk {
	Scanner scan = new Scanner(System.in);
	
	@Override
	public void execute(ArrayList<SungJukDTO> arrayList) {
		System.out.print("삭제할 이름 입력: ");
		String name_del = scan.next();

		int count=0;
		for(SungJukDTO sungJukDTO : arrayList) {
			if(sungJukDTO.getName().equals(name_del)) {
				arrayList.remove(sungJukDTO);
				count++;
			}
		}

		if(count==0) {System.out.println("There is no Memeber in the list.");}
		else {System.out.println(count + " member deleted");}

	}
	
}

⭐ java.lang.Error:  java.util.ConcurrentModificationException 발생

 

 

Exception 원인

for문 실행 시, 고정된 arrayList size가 remove()를 통해 size()가 변경되어 Exception 발생

➕ 추가적인 문제

i=0
arrayList[0] = aaa;
arrayList[1] = aaa;
arrayList[2] = bbb;
-> idx 변경
i=1
arrayList[0] = aaa;
arrayList[1] = bbb;
-> idx=0인 arrayList의 aaa data를 삭제할 수 없음

 

 

해결 방법

데이터의 크기가 변경되어도 프로그램 작동에 영향을 미치지 않는 Iterator interface 활용

public class SungJukDelete_T implements SungJuk {
	Scanner scan = new Scanner(System.in);
	
	@Override
	public void execute(ArrayList<SungJukDTO> arrayList) {
		System.out.print("삭제할 이름 입력: ");
		String name_del = scan.next();

		int count=0;
		
		Iterator<SungJukDTO> iterator = arrayList.iterator();
		// iterator는 idx num과 무관

		while(iterator.hasNext()) {
			SungJukDTO sjDTO = iterator.next();
			// arrayListd에 항목을 꺼내서 sjDTO에 보관
			// iterator 다음 항목으로 이동
			
			if(sjDTO.getName().equals(name_del)) {
				iterator.remove();
				// remove(): iterator가 remove 전 꺼내놓은 항목(Buffer에 저장한 항목)을 제거
				// Buffer에 저장된 값을 제거하는 것이므로 next()를 사용하지 않으면 remove()를 사용할 수 없음
				count++;
			}
			
		}


		if(count==0) {System.out.println("There is no Memeber in the list.");}
		else {System.out.println(count + " member deleted");}

	}
	
}

⭐ index를 통해 원본 데이터를 제거하면서 원본 데이터를 사용하는 방식이 아닌,

Buffer에 따로 저장해놓고 데이터를 간접적으로 삭제하는 방식을 취함으로 ConcurrentModificationException을 해결할 수 있음