Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java扫描器从第二次开始工作_Java_Console_Java.util.scanner - Fatal编程技术网

Java扫描器从第二次开始工作

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) {

我试图在按下控制台中的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) {
        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键才能继续