首页 > 解决方案 > Q:帮助理解关闭Scanner

问题描述

这是我的工作代码。

public static void play() {

    Scanner myScanner = new Scanner(System.in);
    Scanner myOtherScanner = new Scanner(System.in);

    while (!endCondition()) {
        //stuff
        shoot(myScanner);
    }

    keepPlaying(myOtherScanner);

    myScanner.close();
    myOtherScanner.close();
}

接收方法myScanner

static void shoot(Scanner sc) {
    int bullet;
    //Stuff

    bullet = Integer.parseInt(sc.next());

    //More stuff
}

接收方法myOtherScanner

static void keepPlaying(Scanner myOtherScanner) {

    //Stuff

    int option = Integer.parseInt(myOtherScanner.next());

    //More stuff
}

现在我不明白的是:

如果我myScanner在调用之前关闭keepPlaying(myOtherScanner)myOtherScanner.next()将抛出:

NoSuchElementException

从我发现似乎关闭单个 Scanner closes System.in。那是对的吗?

绕过它的好方法是什么?只在最后关闭?

用单机更好Scanner吗?

我是否使用Scannersas 全局类元素?

我只是不关闭Scanners吗?

标签: javajava.util.scannersystem.in

解决方案


解决此问题的方法是创建自己的java.io.FilterInputStream.

Scanner myScanner = new Scanner(new FilterInputStream(System.in) {
    public void close() throws IOException {
    }
});

现在当你打电话时,

myScanner.close();

它只关闭你FilterInputStream离开的System.in开放 来源


Scanner或者,只要您的应用程序是单线程的,您就可以只使用一个。


推荐阅读