마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

큐에서 isEmpty()로 확인을 했는데도 불구하고 NoSuchElementException 발생하는 이유

0 추천

평소에는 A활동을 하며 반복적인 루틴을 돌다가 버튼을 클릭하면 큐에 데이터를 추가 시켜

루틴에서 큐에 데이터가 생기면 B활동을 하도록 했었습니다

물론 큐에서 데이터를 확인할 때는 queue.isEmpty()로 데이터 유무를 확인하고 데이터를 꺼내는 작업을 했는데

NoSuchElementException이 발생했습니다.

이게 지속적으로 발생이 되면 여러가지 테스트를 하여 확인을 할 수 있을텐데

만든지 몇달만에 처음 발생한 문제라서요...

if(!QUEUE.isEmpty()){
    value = Integer.parseInt(QUEUE.element().get("value"));//여기서 에러 발생 value는 map 데이터를 QUEUE.offer() 할때 필수로 추가하는 데이터
    Map<String, String> map = QUEUE.poll();
    //B활동..
}
빈길 (1,270 포인트) 님이 2021년 1월 20일 질문
QUEUE를 뭘로 구성한 건가요?
 어떤 분은 linkedlist로 구현하고 이름을 queue라고 하시는 분도 있고요.
그리고 Queue의 구조도 있어야 할 것 같네요..
Map 구조는 Class구조보다는 사실 불안정한 느낌이거든요.
Class는 정의된 것만 들어간다는 보장이 되지만,
Map은 뭐가 들어갈지 모르잖아요..
Queue<Map<String, String>> QUEUE = new LinkedList<>();
이렇게 구성하였습니다.
음.. 그냥 이렇게만 봐서는 알기 힘드네요.
스택 트레이스도 없고..
스택트레이스가 있어도 소스의 몇번쨰 줄인지도 알 수가 없겠군요..

에러가 Queue.isEmpty()에서 난거라면, Queue가 null인지 체크하는 부분이 추가 되어야 할 것 같고요. null이 되는 원인은 파악을 해야할 것 같네요.

Queue.element()에서 난 거라면 Queue의 상태를 브레이크 포인트로 봐야겠네요.

혹시 LinkedList를 Thread에서 호출하지는 않나요?
ThreadSafe 하지 않거든요.
먼저 poll도 NoSuchElementException을 발생시킬 수 있다고 하네요. 질문에는 없지만 제 추측으로는 poll하시기 전에 해당 queue가 다른 곳에서 접근되고 있어서 그 시점에 empty가 된 것으로 보입니다. 따라서 synchronised나 쓰레드에 안전한 방법을 써서 동시접근을 막으시는 것이 필요하다고 봅니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...