исключение курсора mongodb - Java - PullRequest
7 голосов
/ 28 октября 2011

Я использую mongodb для хранения информации пользователей.Я хотел создать метод, который получает информацию из базы данных, создает объекты Player и вставляет их в массив Players.

это следующий метод

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 вне метода while и обнаружил исключение, но затем оно напечатало только имя первого пользователя.Кажется, что он выдает исключение во второй итерации.

Вот сообщение с исключением, которое я получаю.

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)

1 Ответ

9 голосов
/ 28 октября 2011

Вызывая метод 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);
    }
...