【问题标题】:Q: Help understanding closing ScannerQ:帮助理解关闭Scanner
【发布时间】:2018-10-11 10:17:37
【问题描述】:

这是我的工作代码。

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
}

现在我不明白:

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

NoSuchElementException

根据我的发现,关闭单个 Scanner 似乎会关闭 System.in。对吗?

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

使用单个Scanner 更好吗?

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

我只是不关闭Scanners吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    现在当你打电话时,

    myScanner.close();
    

    它只关闭你的FilterInputStream 离开System.in 打开 (Source).


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

    【讨论】:

      【解决方案2】:

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

      一旦输入流关闭,它就无法重新打开(根据 javadoc),并且由于您在两个扫描仪中使用相同的System.in 流,一旦它被myscanner 关闭,它就不适用于myOtherScanner,因此它给出了例外。

      【讨论】:

        猜你喜欢
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        相关资源
        最近更新 更多