☕ 기본 환경: 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을 해결할 수 있음
'Java > Java with Error' 카테고리의 다른 글
[해결 방법] java.io.NotSerializableException (0) | 2023.02.17 |
---|---|
[해결 방법] java.util.IllegalFormatPrecisionException (0) | 2023.02.17 |
[해결 방법] java.lang.Error (0) | 2023.02.16 |
[해결 방법] java.lang.Error (0) | 2023.02.13 |
[해결 방법] Resource leak: '...' is never closed (0) | 2023.02.12 |