일반 Iterator.next() - NoSuchElementException

황제낙엽 2018.10.28 03:41 조회 수 : 2547

톰캣에서 NoSuchElementException 에러가 발생해서 1시간동안 원인을 찾지 못해 포기했다가

하루가 지나 레퍼런스 몇개 보다보니 문득 감이 잡히는 지점이 발견되었고 결국 오류를 잡을 수 있었다

 

NoSuchElementException 은 API를 찾아보면 if the iteration has no more elements 라고 나온다

next 함수로 다음 데이터를 가져오지 못할때 발생한다고 하는데

톰캣을 실행한 런타임 시점에서만 발생하고 톰캣 콘솔창 출력에서는 next() 함수의 다음 라인을 가리킨다는게 함정이었다

 

다음과 같이 HashMap 데이터를 두번 순회하는 코드를 작성하였다

 

        Task task = null;

 

        Iterator keyIterMoveTo = taskMap.keySet().iterator();

        while (keyIterMoveTo.hasNext()) {

            Object moveKeyObj = keyIterMoveTo.next();

            task = taskMap.get(moveKeyObj);

                ... ... ...

        }

 

        Iterator keyIterToApply = taskMap.keySet().iterator();

        while (keyIterToApply.hasNext()) {

            Object applyKeyObj = keyIterToApply.next();

            task = taskMap.get(applyKeyObj);

                ... ... ...

        }

 

Iterator 객체를 중복해서 접근하지도 않고 next() 취한 객체도 다른 변수에 담았다

Exception 에러메세지는 위에 붉은색으로 표시한 부분이 아닌 그 다음 라인의 HashMap의 get() 함수 호출 라인을 가리키고 있었다

문제가 HashMap의 get() 함수에 있는게 맞긴 했는데 오류는 Iterator 의 next() 에서의 Exception 이 발생하는게 의문이긴 하지만

어쨌든 다음과 같은 방법으로 해결이 가능했다

 

        Task task = null;

 

        Iterator keyIterMoveTo = taskMap.keySet().iterator();

        while (keyIterMoveTo.hasNext()) {

            Object moveKeyObj = keyIterMoveTo.next();

            task = (Task) taskMap.get(moveKeyObj);

                ... ... ...

        }

 

        Iterator keyIterToApply = taskMap.keySet().iterator();

        while (keyIterToApply.hasNext()) {

            Object applyKeyObj = keyIterToApply.next();

            task = (Task) taskMap.get(applyKeyObj);

                ... ... ...

        }

 

HashMap에서 get()한 오브젝트에 강제 형변환을 걸어주었다

JDK8버전을 사용하고 있는데 이전 버전에서도 그랬는지 모르겠지만 Iterator의 next() 함수와 HashMap 의 get() 함수의 return 객체들은 모두 Object 인데

위와 같이 형변환이 없으면 저 부분에서 문법오류를 넣어주면 안될려나? 라는 아주 아주 사소한 의문이 들긴했다 (쓸데없음)

 

여하튼 다음부턴 NoSuchElementException 에러가 발생하면 다음과 같은 절차로 코드를 살펴보자

 

1. Iterator를 전체 순환후 혹시나 next() 함수를 또 호출하게 실수하지 않았는지?

2. 위와 같이 중복 순환시 실수로 동일 Iterator객체를 접근하지는 않았는지?

3. 마지막으로 위와 같이 next() 로 가져온 key값으로 HashMap에서 get() 한 오브젝트에서 올바른 클래스로 형변환은 했는지?

 

자바 개발 15년간 매번 1번, 2번만 신경썼는데 3번과 같은 복병이 있을줄은 몰랐다

 

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
347 java.util.Optional 에서의 map() 함수의 이해 황제낙엽 2026.06.24 666
346 linux(ubuntu) 의 jdk 21 이 설정된 환경에서 jdk 17 로 다운그레이드 절차 황제낙엽 2025.09.22 1532
345 [ChatGPT] javax.* 패키지와 jakarta.* 패키지의 혼합 사용 방안 황제낙엽 2025.04.15 2459
344 [ChatGPT] *.servlet.http.HttpServlet 클래스를 사용할 수 있는 주요 WAS 목록 황제낙엽 2025.04.14 2038
343 [ChatGPT] JDBC API에서 java.sql과 javax.sql 패키지의 차이점 황제낙엽 2025.01.31 2218
342 jakarta.servlet 패키지를 이용한 File Upload 구현 (2024.03.03, Servlet 5.0) 황제낙엽 2025.01.02 2310
341 [ChatGPT] Java EE가 Jakarta EE로 전환 황제낙엽 2025.01.01 2525
340 [ChatGPT] File.delete() 함수로 파일 삭제가 되지 않는 경우 황제낙엽 2024.12.10 2809
339 [ChatGPT] <jsp:include>에서 flush="true"를 설정시의 몇 가지 문제점 과 대안 황제낙엽 2024.07.19 2493
338 [Copilot] JSP, Servlet, web.xml, mysql 한글 설정 황제낙엽 2024.07.12 2555
337 Base64 클래스의 encode, decode 에서 URL-safe 황제낙엽 2024.07.10 2624
336 [Copilot] JSP 에서 다른 페이지를 현재 페이지에 포함시키는 문법 (include) 황제낙엽 2024.06.26 2570
335 Exception 출력에 대한 고찰 황제낙엽 2024.06.10 2198
334 google-auth-library-oauth2-http 라이브러리 다운로드 황제낙엽 2023.11.19 4025
333 firebase-admin-java 라이브러리 다운로드 (firebase admin sdk library) 황제낙엽 2023.11.19 2805
332 Enum 활용 (개인블로그, Effective Java) file 황제낙엽 2023.11.02 2759
331 Enum 활용 (우아한기술블로그) file 황제낙엽 2023.11.02 2790
330 servlet name 에 camel case 를 사용해서는 안되는 이유 황제낙엽 2023.10.24 2508
329 org.apache.commons.fileupload.servlet.ServletFileUpload 이용 예시 황제낙엽 2023.08.25 3336
328 ServletFileUpload.parseRequest() 실행 결과 리스트가 비어있는 오류 황제낙엽 2023.08.25 2935