为了账号安全,请及时绑定邮箱和手机立即绑定

问:帮助理解关闭扫描仪

问:帮助理解关闭扫描仪

吃鸡游戏 2021-11-11 16:23:58
这是我的工作代码。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吗?
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

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


Scanner myScanner = new Scanner(new FilterInputStream(System.in) {

    public void close() throws IOException {

    }

});

现在当你打电话时,


myScanner.close();

它只关闭你FilterInputStream离开System.in开放 (源)。


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


查看完整回答
反对 回复 2021-11-11
?
www说

TA贡献1775条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2021-11-11
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信