问:帮助您了解关闭扫描仪

时间:2018-10-11 10:17:38

标签: java java.util.scanner system.in

这是我的工作代码。

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

从我发现的结果来看,关闭单个扫描仪似乎会关闭System.in。正确吗?

有什么好的解决方法? 仅在最后关门?

使用单个Scanner更好吗?

我是否将Scanners用作全局类元素?

我只是不关闭Scanners吗?

2 个答案:

答案 0 :(得分:1)

为此,一种解决方法是创建自己的java.io.FilterInputStream

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

现在,当您打电话时,

myScanner.close();

它仅关闭您的FilterInputStream,而System.in处于打开状态 ({Source


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

答案 1 :(得分:0)

当您像调用.close()一样在任何资源上调用myScanner.close();时,它也会关闭资源和in流。

输入流一旦关闭,就无法重新打开(根据javadoc),由于您在两个扫描器中都使用相同的System.in流,因此一旦被myscanner关闭,它就无法用于{ {1}},因此它给出了异常。