7

ユーザーの情報を保存するためにmongodbを使用しています。データベースから情報を取得し、Player オブジェクトを作成し、それらを Player の配列に挿入するメソッドを作成したかったのです。

これは次の方法です

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 人のユーザーが保存されています。たとえば、最初にメソッドを呼び出してから名前を出力しようとすると、例外が発生します。メソッドの while の外で try-catch を使用して例外をキャッチしましたが、最初のユーザーの名前のみが出力されました。2回目の繰り返しで例外がスローされるようです。

これが私が受け取っている例外を除いたメッセージです。

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)
4

1 に答える 1

9

メソッドを呼び出すcursor.next()と、次の要素が取得され、カーソル位置がインクリメントされます。反復ごとに3回呼び出すcursor.next()ため、2回目の反復ではカーソルに「これ以上」要素がありません。反復に対してローカルな変数に要素を保存します。

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);
    }
于 2011-10-28T14:46:27.510 に答える