【问题标题】:Why the press any key method does not stop in a loop? [duplicate]为什么按任意键方法不会循环停止? [复制]
【发布时间】:2019-03-03 23:45:09
【问题描述】:

我在这里找到的java中有这个方法。

private void pressAnyKeyToContinue() {
     try {
         System.in.read();
     }  
        catch(Exception e) {}  
 }

我遇到的问题是当我想多次调用它时。我在打印如下消息的方法中使用它:

private void keyMessage() {
    System.out.print("Press any key to continue...");
    pressAnyKeyToContinue();

然后我在这里使用这个方法:

public void method() {
    message1();
    for (Class class : classes) {
        keyMessage();
    }   
}

我遇到的问题是当我首先调用 method() 时它会打印出来。

Otuput: Press any key to continue...

然后我按一个键 + 回车。直到这里一切都很完美,但它会打印出来:

Output: Press any key to continue... //* times of the loop

我的意思是它不允许我按任何键。它一直持续到循环结束。

感谢您对我的英语的回答和抱歉。我知道这样不好。

【问题讨论】:

    标签: java key continue any


    【解决方案1】:

    标准控制台 java 根本无法做到这一点。所有输入的字符都会被缓冲,直到您按下回车键,此时它们都可以在 System.in 中使用。

    因此,如果您将“按任意键”代码循环 5 次,然后我输入句子“你好!”,您的代码仍停留在第一个,等待按键。如果我然后按回车键,所有 5 个循环立即完成,如果您稍后调用 waitForKey,它会立即返回另外 2 到 3 次(一次用于感叹号,一次用于换行符.. 如果在 Windows 上两次,因为它们的换行符是 2 个字符)。

    TL;DR:您不能为此使用System.in.read()。完全没有。

    一种解决方案是要求用户不要按“any”键,而是按“enter”键,然后在将分隔符设置为换行符后使用例如扫描仪的 next() 调用,或者编写代码一直调用System.in.read(),直到它返回'\n':

    private void pressEnterToContinue() {
        while (true) {
            int c;
            try {
                c = System.in.read();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            if (c == -1 || c == '\n') return;
        }
    }
    

    【讨论】:

    • 非常感谢您的回答。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2016-01-19
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多