2011-10-28 41 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

像魅力一樣工作!謝謝! –