[Error]java.util.NoSuchElementException

순차적 검색이 가능한 데이터프레임 안에 담긴 자료를 가져올 때 next 메서드를 써서 데이터를 가져오는데

이때 하나의 값에 대해서 next가 두 번 나오게되면 발생하는 오류이다.

코드로 확인해보자.



===========================Java===========================

//수정 전 코드


while(mongoCursor.hasNext()) {

   //key, value를 분리

   String instance1 = (String) mongoCursor.next().get("_id");

   Double instance2 = mongoCursor.next().getDouble("value");

   key.add(instance1);

   value.add(instance2);

   System.out.println(instance1);

   System.out.println(instance2);

  }// end of while;

===========================Java===========================



MongoDB에서 데이터의 Java쪽으로 key와 value를 구분해서 꺼내는 코드이다.

while 안쪽에 
String instance1 = (String) mongoCursor.next().get("_id");
Double instance2 = mongoCursor.next().getDouble("value");

이렇게 next() 메서드가 두 개 들어가있다.

이러면 아래와 같은 문제가 발생한다.
1. java.util.NoSuchElementException이 생긴다.
2. 데이터가 하나 건너서 들어간다.



1이면 그나마 확인할 수 있어 다행이지만 2의 경우가 문제이다.

오류는 안 나는데 데이터는 제대로 안 들어오기 때문이다.



조금 더 설명을 해보자면 아래와 같은 데이터가 있다고 해보자.

Data1    Data2    Data3    Data4    Data5    Data6.....

while 첫번째 루프에서 String instance1은 Data1번의 자료를 이용할 것이다.

[while의 첫번째 루프]
  (*) <- String instance1
Data1    Data2    Data3    Data4    Data5    Data6.....

그런데 Double instance2로 가게되면 .next() 메서드로 인해 데이터가 하나 더 넘어가게 된다. 즉,

[while의 첫번째 루프]
                 (*) <- Double instance2
Data1    Data2    Data3    Data4    Data5    Data6.....

이렇게 된다는 것이다.



이런 현상을 방지하기 위해 .next()는 while 루프 내에서 한 번만 나와야 한다.

위의 코드를 고쳐보자면


===========================Java===========================

//수정 후 코드


while(mongoCursor.hasNext()) {

   //while 루프 내 .next()는 한 번만 존재해야 한다.

   Document doc = mongoCursor.next();

   //key, value를 분리

   String instance1 = (String) doc.get("_id");

   Double instance2 = doc.getDouble("value");

   key.add(instance1);

   value.add(instance2);

   System.out.println(instance1);

   System.out.println(instance2);

  }// end of while;

===========================Java===========================


이런 식으로 고치면 된다.

+ Recent posts