2011-10-28 24 views
7

我正在使用mongodb来存储用户信息。 我想创建一个方法,从数据库获取信息,创建播放器对象并将它们插入播放器数组中。mongodb游标异常 - Java

这是下面的方法

public ArrayList<Player> getArrayOfPlayers(){ 
    ArrayList<Player> savePlayers = new ArrayList<Player>(); 
    DB db = connectToMongo(); 
    DBCollection coll = db.getCollection("players"); 
    DBCursor cursor = coll.find(); 

     while(cursor.hasNext()) { 
      String tempName = (String)cursor.next().get("name"); 
      String tempSession = (String)cursor.next().get("session"); 
      String tempStringScore = (String)cursor.next().get("score"); 

      int tempScore = Integer.parseInt(tempStringScore); 

      Player player = new Player(tempName,tempSession,tempScore); 
      savePlayers.add(player); 
     } 


    return savePlayers; 
} 

我有4个用户存储在数据库中,当我试图先调用该方法,然后打印我得到一个例外,例如名称。 我在方法的外面使用了一个try-catch,而我发现了异常,但它只打印了第一个用户的名字。它似乎在第二次迭代中引发异常。

以下是我正在接收的例外信息。

java.lang.RuntimeException: no more 
com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:394) 
com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:360) 
com.mongodb.DBCursor._next(DBCursor.java:445) 
com.mongodb.DBCursor.next(DBCursor.java:525) 
machine.DAOMongodb.getArrayOfPlayers(DAOMongodb.java:74) 
machine.testDB.doGet(testDB.java:43) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

回答

9

调用cursor.next()方法,您将获得下一个元素并增加光标位置。 您每次迭代都会调用cursor.next() 3次,因此在第二次迭代中,游标中没有“没有更多”元素。 将该元素保存到迭代中的局部变量中:

while(cursor.hasNext()) { 
     DBObject tobj = cursor.next(); 
     String tempName = (String)tobj.get("name"); 
     String tempSession = (String)tobj.get("session"); 
     String tempStringScore = (String)tobj.get("score"); 

     int tempScore = Integer.parseInt(tempStringScore); 

     Player player = new Player(tempName,tempSession,tempScore); 
     savePlayers.add(player); 
    } 
+1

像魅力一样工作!谢谢! –