TIL(Today I Learned)

TIL - ConcurrentModificationException 예외 발생

Happy._. 2024. 4. 23. 23:52

Q 어떤 문제가 있었는지

간단하게 만들었던 계산기를 더 업그레이드 하기 위해 숫자와 연산 기호를 따로 저장하고 수정하기 위해 리스트를 사용하면서 ConcurrentModificationException 예외가 발생했다.

배열이나 리스트를 사용하면서 IndexOutOfBoundsException 예외는 자주 봤었지만 이번 예외는 처음 보는거라 구글링으로 예외에 대해 찾아 보았다.

컬렉션 수정 도중 다른 스레드에서 동시에 수정하려고 할 때 발생한다는 글이 많았는데 스레드는 사용하지는 않았지만 컬렉션 수정을 시도한 것은 맞기 때문에 내 코드에서 리스트를 순회하는 코드를 다시 살펴 보았다.


Q 어떻게 해결했는지

내 코드를 살펴보니 리스트를 forEach로 순회하면서 그 안에서 현재 순회하고 있는 리스트의 요소를 삭제하려고 해서 발생한 문제였다.

내가 컬렉션을 수정을 시도한 이유는 리스트에서 두 개의 숫자를 꺼내 연산하고 계산이 끝난 숫자는 삭제하는 방식으로 순회를 생각했는데 내 생각이 틀렸던 것이다.

현재는 리스트 순회 대신 재귀 호출 방식으로 코드를 수정했는데 더 나은 방법이 떠오르면 수정을 해야할 것 같다.


Q 뭘 새롭게 알았는지

ConcurrentModificationException 예외가 발생하는 이유

  • 리스트 순회 중 리스트의 요소를 삭제하려고 할 때 → 내가 시도했던 것
  • 컬렉션을 수정하는 도중에 다른 스레드에서 동시에 수정하려고 할 때 → 구글링을 통해 알게 됨