Exception in thread "main" java.util.ConcurrentModificationException
❓ 문제 상황
2차원 배열을 입력받아 각 배열을 이용해서 만든 HashMap을 리턴하는 문제였다. 중요한 조건 중 하나가 중복되는 키가 있으면 저장된 초기값을 리턴해 줘야 하는 것이었는데 나는 HashMap에 먼저 담아두고 그 다음 중복되는 키를 찾아 삭제해 주자라는 생각을 하고 코드를 짰다.
HashMap에 put() 을 해준 뒤 중복되는 키를 찾고 해당되는 키가 있으면 삭제하라는 코드를 작성하였으나 위와 같은 에러가 발생하였다.
검색을 해보니 java.util.ConcurrentModificationException 에러는 두 가지 상황에 발생한다고 한다.
- 반복자를 사용하여 컬렉션을 순회하고 있는 도중 컬렉션의 구조가 변경된 경우
- 멀티스레드 환경에서 여러 스레드가 동시에 컬렉션을 수정하는 경우
보통 첫 번째 경우가 많이 발생한다고 한다. 특히 컬렉션 객체에 remove 메서드를 호출할 때...!
즉, for문에 newMap.keySet()이 참조되면서 동시에 remove(key) 로 해당 key와 value가 삭제되면서 발생하는 문제였다.
Iterator를 사용한다거나 Set.copyOf() 메서드로 복사를 하여 사용하는 방법들이 있었지만... 애초에 코드를 잘못 짠 문제도 있고 해서 싹 뜯어 고쳤다. 애초에 put() 해서 키와 값을 넣어줄 때 중복된 값을 알아서 걸러주는데 그걸 생각을 못 하고 엉뚱하게 따로 삭제하는 코드를 만들어주니 수정해도 원하는 결과대로 나오지 않았다.
그래서 중간에 키가 중복되는 게 없는 경우만 값을 넣어줄 수 있도록 변경해 주니 원하는 대로 값이 잘 출력되었다!
'Error Handling Log' 카테고리의 다른 글
No candidates found for method call useJUnitPlatform (0) | 2023.07.02 |
---|---|
[코딩테스트] incompatible types: String cannot be converted to boolean (0) | 2023.06.26 |
AOP 부분 적용 안 되는 문제 --> 포인트컷 (0) | 2023.06.08 |
[Java] array lengths differ, expected: <2> but was: <3> (0) | 2023.05.09 |
[Java] 실행 파일 오류 (0) | 2023.05.09 |