Java扫描器从第二次开始工作
我试图在按下控制台中的enter键后调用一个方法。问题是,在我第二次按enter键时调用了该方法。第一次进入按键后如何调用我的方法Java扫描器从第二次开始工作,java,console,java.util.scanner,Java,Console,Java.util.scanner,我试图在按下控制台中的enter键后调用一个方法。问题是,在我第二次按enter键时调用了该方法。第一次进入按键后如何调用我的方法 public void read() { Scanner scanner = new Scanner(System.in); System.out.println("Press Enter to continue"); try { System.in.read(); } catch (IOException e) {
public void read() {
Scanner scanner = new Scanner(System.in);
System.out.println("Press Enter to continue");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
if (scanner.hasNextLine()) {
this.win();
}
}
public void win() {
if (true) {
this.read();
}
}
您不需要
System.in.read()代码>。如果此扫描仪的输入中有另一行,则java.util.Scanner.hasNextLine()
方法返回true。此方法在等待输入时可能会阻塞
public class MyClass {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
System.out.println("Press Enter to continue");
if (scanner.hasNextLine()) {
System.out.println("Victory!");
}
}
}
基本上,您的代码在两点等待用户按下任何键。首先是System.in.read()然后在scanner.hasNextLine()
处。这就是为什么在控制台上打印victory
之前需要按两次Enter键的原因。删除System.in.read()代码>或scanner.hasNextLine()
来自您的代码将解决此问题。等待按Enter键的代码将在scanner
看到该字符之前从输入流中“窃取”该字符。因此,第一个'\n'
被System.in.read()
行使用
当基于控制台为扫描仪调用scanner.hasNextLine()
时,代码会阻塞以查看最终用户是否输入一行或终止流。第二个'\n'
需要hasNextLine
方法返回
您可以通过删除对System.in.read()
的调用,并在下次调用之前调用getNextLine()
来解决此问题:
public void read() {
Scanner scanner = new Scanner(System.in);
System.out.println("Press Enter to continue");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
if (scanner.hasNextLine()) {
scanner.nextLine(); // Remove '\n' from the buffer
this.win();
}
}
问题是,我触发了另一个method2,我想再次返回method1(按任意键),然后按Enter键转到method2@TeodorKolev调用scanner.hasNextLine()
将被阻止,直到按下Enter键。你甚至不需要检查它的返回值。我不明白,我正在尝试在当前解决方案中按enter键的两种方法之间切换,因为第一次它没有再次提示并等待再次按enter键。问题是我触发了另一个方法2,我想返回到方法1(按任意键)同样,当按下Enter键转到Method2时,这是一个不寻常的代码结构,因为这两个函数以一种似乎是无限递归的方式相互调用。这是故意的吗?是的。每次必须按enter键才能继续