7 Stimmen

mongodb cursor exception - Java

Ich verwende Mongodb, um Informationen über Benutzer zu speichern. Ich wollte eine Methode erstellen, die die Informationen aus der Datenbank abruft, Player-Objekte erstellt und sie in ein Array von Playern einfügt.

dies ist die folgende Methode

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;
}

Ich habe 4 Benutzer in der Datenbank gespeichert und wenn ich versuche, zuerst die Methode aufzurufen und dann die Namen zum Beispiel zu drucken, erhalte ich eine Ausnahme. Ich habe ein try-catch außerhalb der Methode while verwendet und die Ausnahme abgefangen, aber dann wurde nur der Name des ersten Benutzers gedruckt. Es scheint, dass es die Ausnahme in der zweiten Iteration auslöst.

Hier ist die Nachricht mit der Ausnahme, die ich erhalte.

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)

9voto

LoSciamano Punkte 1099

Aufrufen der cursor.next() Methode erhalten Sie das nächste Element und erhöhen die Cursorposition. Sie rufen cursor.next() 3 Mal für jede Iteration, so dass Sie bei der zweiten Iteration "kein" Element mehr im Cursor haben. Speichern Sie das Element in einer lokalen Variablen für die Iteration:

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);
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X