首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB Java-API NoSuchElement

MongoDB Java-API NoSuchElement
EN

Stack Overflow用户
提问于 2013-05-24 02:59:21
回答 1查看 633关注 0票数 0

我正在构建一个用于MongoDB的Java API。更具体地说,现在我正在尝试将连接到MongoDB并从该数据库中选择数据库和集合的过程封装到它自己的类中。

代码语言:javascript
复制
package mongoDB;

import java.net.UnknownHostException;
import java.util.*;
import com.mongodb.*;

public class MongoDBConnector {
 public DBCollection mongoEasy (String hostname, int port) {

    try {

        Mongo m = new Mongo(hostname, port);

        //choose database
        List<String> databaseNames = m.getDatabaseNames();
        System.out.println("Choose database:  " + databaseNames.toString());
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        if(!databaseNames.contains(input.toString())){
            System.out.println("Database does not exist.");
            System.exit(1);
        }
        DB db = m.getDB(input.toString());

        //choose collection
        Set<String> collectionNames = db.getCollectionNames();
        System.out.println("Choose collection " + collectionNames.toString());
        input = scanner.nextLine();
        if(!collectionNames.contains(input.toString())){
            System.out.println("collection does not exist");
            System.exit(1);
        }
        DBCollection dbCollection = db.getCollection(input.toString());
        scanner.close();
        return dbCollection;

        } catch (UnknownHostException e) {
            System.out.println("Connection failed.");
            System.exit(1);
        } catch(MongoException e){
            System.out.println("Fail.");
            System.exit(1);
        } finally{
        }
    return null;

 }
}

如果我创建一个MongoDBConnector实例,并在一个主方法中调用mongoEasy一次,那么一切都很好。但是,如果我第二次调用该方法,它将输出一个NoSuchElementException。举个例子: package mongoDB;

代码语言:javascript
复制
import com.mongodb.*;
import mongoDB.MongoDBConnector;

public class MongoDBOperations2 {
 public static void main(String[] args) {

    MongoDBConnector mongoDBConnector = new MongoDBConnector();
    DBCollection collection = mongoDBConnector.mongoEasy("localhost", 27017);

    collection = mongoDBConnector.mongoEasy("localhost", 27017);
 }
}

每当我尝试执行此命令时,我都会得到(我删除了数据库和集合名,而main方法的行号不适合,因为我简化了这个问题):

代码语言:javascript
复制
Choose database [...]
test
Choose collection [...]
test
Choose database [local, StudiumUlm, test]
Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at mongoDB.MongoDBConnector.mongoEasy(MongoDBConnector.java:18)
    at mongoDB.MongoDBOperations2.main(MongoDBOperations2.java:)

第二次调用该方法时,扫描器不会等待我的输入。有什么建议吗?

谢谢。干杯,马格努斯

EN

回答 1

Stack Overflow用户

发布于 2013-05-28 04:16:46

根据Scanner.close()文档,如果它实现了Closeable,它将关闭底层的读取器/流。

因为您的代码关闭了扫描器,所以您无法在第一次之后读取System.in (这正是您所看到的)。

代码语言:javascript
复制
public class MongoDBConnector {

    Scanner scanner;
    public MongoDBConnector() {
       this.scanner = new Scanner(System.in);
    }
    public void close(){
        this.scanner.close();
    }
    // the rest of your code but don't create a new scanner or close it 
}

然后在你的主线中这样做:

代码语言:javascript
复制
public class MongoDBOperations2 {
    public static void main(String[] args) {

        MongoDBConnector mongoDBConnector = new MongoDBConnector();
        try {
            DBCollection collection = mongoDBConnector.mongoEasy("localhost", 27017);

            collection = mongoDBConnector.mongoEasy("localhost", 27017);
        }finally {
            mongoDBConnector.close();
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16721839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档