import java.util.Scanner;
public class Foo {
public static void main(String[] args) {
Foo foo = new Foo();
foo.getNextToken();
foo.getNextToken();
}
public void getNextToken() {
Scanner s = new Scanner(System.in);
while (true) {
if (s.hasNext()) {
System.out.println(s.nextLine());
//s.close();
return;
}
}
}
}
当我尝试运行上面的代码时,它的工作方式如您所料。每次我插入一行时,计算机都会粘贴下一行。
但是,如果我取消注释掉s.close()行,并再次运行,我会得到以下行为:
由于某种原因,hasNext()方法持续返回false,尽管很明显存在下一个参数。我尝试了很多方法,但找不到任何解决方法。例如,如果我将代码更改为
public void getNextToken() {
Scanner s = new Scanner(System.in);
System.out.println(s.nextLine());
s.close();
return;
}
然后,同样,它适用于第一个语句,但随后立即给出一个NoSuchElementException。当然,如果你不关闭第一个扫描仪,它工作正常。
我不明白为什么关闭一个扫描仪会影响另一个,但我听说不关闭扫描仪是不好的做法,更重要的是,如果我不关闭,会有一个恼人的黄色错误信息。谁能告诉我解决这个问题的方法,以及为什么会这样?我可以把扫描器作为一个参数传入main方法,并在那里关闭它,但这看起来有点乱。
因为您关闭了< code>System.in。不要那样做。不要关闭扫描仪。也不要创建新的。继续用同一个就好了。它仍然会工作。
在同一个底层输入上使用多个扫描器确实是不好的做法。您将丢失数据。