为了账号安全,请及时绑定邮箱和手机立即绑定

为什么按任意键方法不会循环停止?

为什么按任意键方法不会循环停止?

慕容3067478 2022-07-20 10:34:54
我在这里找到的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我的意思是它不允许我按任何键。它一直持续到循环结束。感谢您对我的英语的回答和抱歉。我知道这不好。
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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


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


TL;DR:你不能用System.in.read()这个。完全没有。


一种解决方案是要求用户不要按“任何”键,而是按“输入”键,然后在将分隔符设置为换行符后使用例如扫描仪的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;

    }

}


查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信