这是我的工作代码。
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
吗?
答案 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}},因此它给出了异常。