sitelink1  
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

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

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

 

NoSuchElementExceptionAPI를 찾아보면 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번과 같은 복병이 있을줄은 몰랐다

 

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
271 [HttpURLConnection, HttpsURLConnection] 코드참조용 샘플프로젝트 secret 황제낙엽 2019.01.18 0
» Iterator.next() - NoSuchElementException 황제낙엽 2018.10.28 344
269 OracleJDK 유료화 FAQ (Oracle Java 의 유료화에 대한 어느분의 정리) 황제낙엽 2018.10.11 128
268 메일서버(daum.net)에 POP3를 이용하여 메일 가져오기 예제 file 황제낙엽 2018.10.09 940
267 Sending mail through Java using SMTP of gmail file 황제낙엽 2018.09.13 163
266 Read or get mails using pop in java (using gmail) file 황제낙엽 2018.09.13 861
265 Collections.sort() , Comparator 황제낙엽 2018.08.23 48
264 JavaMail - Connecting Gmail pop3 server. 황제낙엽 2018.08.20 206
263 JavaMail - 네이버 메일 수신하기(POP3) 황제낙엽 2018.08.20 1413
262 JavaMail - POP3로 메일 읽어오기 - 단순샘플 황제낙엽 2018.08.20 107
261 [HttpURLConnection, HttpsURLConnection] Response 로 받은 데이터가 압축되어 있는 경우(gzip, deflate) 황제낙엽 2018.08.16 254
260 [HttpURLConnection, HttpsURLConnection] 자바 Http / https 의 결과를 주고받을때 세션을 유지 황제낙엽 2018.08.12 77
259 [HttpURLConnection] 자바(Java) URL 접속 및 세션 관리 file 황제낙엽 2018.08.12 109
258 json-rpc 에서 한글 문제 황제낙엽 2018.08.08 175
257 org.apache.commons.io.FilenameUtils (getExtension) 황제낙엽 2018.04.01 1209
256 이미지 파일의 화면사이즈와 포맷(확장자) 구하기 황제낙엽 2018.04.01 472
255 File 을 다루기 위한 유틸 클래스 file 황제낙엽 2018.02.28 99
254 상수의 데이터 타입 황제낙엽 2018.01.26 33
253 Java에서 User-Agent 파써 사용하기 황제낙엽 2017.11.20 418
252 현재 월,일,시간,분,초 등등 가져오기 황제낙엽 2017.11.02 858