问:帮助理解关闭扫描仪

这是我的工作代码。


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()将抛出:


无此类元素异常


从我发现的情况来看,关闭单个 Scanner 似乎会关闭System.in. 那是对的吗?


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


使用单个更好Scanner吗?


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


我只是不关闭Scanners吗?


吃鸡游戏
浏览 126回答 2
2回答

慕斯709654

解决此问题的方法是创建您自己的java.io.FilterInputStream.Scanner myScanner = new Scanner(new FilterInputStream(System.in) {    public void close() throws IOException {    }});现在当你打电话时,myScanner.close();它只关闭你FilterInputStream离开System.in开放 (源)。或者Scanner,只要您的应用程序是单线程的,您就可以只使用一个。

www说

当您.close()像调用myScanner.close();它那样调用任何资源时,它也会关闭资源和in流。一旦输入流关闭,它就无法重新打开(根据 javadoc),并且由于您System.in在两个扫描仪中使用相同的流,一旦它被关闭,myscanner它就不可用于myOtherScanner,因此它给出异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java