Java do while循环跳过控制台输入

Java do while循环跳过控制台输入,java,do-while,system.in,Java,Do While,System.in,输出如下: class Noob1 { public static void main(String args[]) throws java.io.IOException{ char ch, answer; answer = 'g'; do { System.out.println("Guess from A-L:"); ch = (char) System.in.rea

输出如下:

class Noob1 {
    public static void main(String args[]) 
        throws java.io.IOException{

        char ch, answer;
        answer = 'g';

        do {
            System.out.println("Guess from A-L:");
            ch = (char) System.in.read();
                if(ch == answer){
                    System.out.println("Congratz!");
            } else System.out.println("Try again!");
        } while (ch != answer);
    }
}
我不明白为什么,我在读一本初学者的书,所有的东西都应该被涵盖,我错过了什么

在循环的末尾添加下面的代码可以确认它正在循环,但不知何故,输入被跳过了

Guess from A-L:
a
Try again!
Guess from A-L:
Try again!  // this is where intuitively it should ask for input again
Guess from A-L:
Try again!
Guess from A-L:
g           //  input is skipped a few times
Congratz!
所以我用这个让它工作起来:

i++;
System.out.println(i);

格式仍然很糟糕吗?

read
只读取一个字符,但在回答时,您键入的字符不止一个:您键入的是
a
,后跟一个换行符,因为只有按Enter键,控制台输入才会发送到流。该换行符位于流中,等待下一个
read
读取,这就是它不等待您再次键入内容的原因


您可能需要在
缓冲读取器中包装
系统。在
中,使用并处理您得到的是字符串而不是一个字符,或者在得到字符后,反复调用
读取
,直到得到换行符。我会选择
bufferedReader

read
只读取一个字符,但在回答时,您键入的字符不止一个:您键入的是
a
,后跟一个新行,因为只有按Enter键,控制台输入才会发送到流。该换行符位于流中,等待下一个
read
读取,这就是它不等待您再次键入内容的原因


您可能需要在
缓冲读取器中包装
系统。在
中,使用并处理您得到的是字符串而不是一个字符,或者在得到字符后,反复调用
读取
,直到得到换行符。我会选择
bufferedReader

您同时输入两个字符-字符本身和一个“\n”新行字符。将读取字符的实现替换为以下内容:

import java.io.*;

class Noob1 
{
    public static void main(String args[]) throws java.io.IOException
    {
        char ch, answer;
        String tmp;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        answer = 'g';

            do 
            {
                System.out.println("Guess character followed by ENTER:");
                tmp = bufferedReader.readLine();
                ch = tmp.charAt(0); // only first char is considered
                if (ch == answer) 
                    System.out.println("Gratz! the answer was: " + ch + "!");
                else 
                    System.out.println("Nope, try again..");
            } while (ch != answer);
    }
}

charAt确保只提取第一个字符。

您一次输入两个字符-字符本身和一个“\n”新行字符。将读取字符的实现替换为以下内容:

import java.io.*;

class Noob1 
{
    public static void main(String args[]) throws java.io.IOException
    {
        char ch, answer;
        String tmp;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        answer = 'g';

            do 
            {
                System.out.println("Guess character followed by ENTER:");
                tmp = bufferedReader.readLine();
                ch = tmp.charAt(0); // only first char is considered
                if (ch == answer) 
                    System.out.println("Gratz! the answer was: " + ch + "!");
                else 
                    System.out.println("Nope, try again..");
            } while (ch != answer);
    }
}

charAt确保只提取第一个字符。

养成从一开始就使用一致缩进和支撑的习惯很有用。问题中的代码可能需要一些清理。@Tunaki:OP没有使用
扫描仪
。但是这个问题很可能还有一个早期版本使用了
系统。直接在
中。@T.J.Crowder你是对的。。。我真傻。谢谢你指出这一点。这可能更合适,或者@Tunaki:fings,我使用了第一个。从一开始就习惯使用一致的缩进和支撑是很有用的。问题中的代码可能需要一些清理。@Tunaki:OP没有使用
扫描仪
。但是这个问题很可能还有一个早期版本使用了
系统。直接在
中。@T.J.Crowder你是对的。。。我真傻。谢谢你指出这一点。这会更合适,或者@Tunaki:govery finds,我用的是第一个。啊,在某个地方简要提到过。为什么它会循环3次呢?换行符不是只有一个值吗?或者为什么它会占用3个缓冲区“空格”?在本例中,我将如何使用bufferedReader?@naike:在某些操作系统(如Windows)上,输入=
\r\n
,这是两个字符(回车[char 13]和换行[char 10])。重新查看BufferedReader,查看JavaDoc并尝试一下,再次意识到您将得到一个字符串而不是一个字符。如果你在上面花了一些时间后遇到了麻烦,请用你的
BufferedReader
代码发布一个新问题。谢谢,这澄清了一些问题,我会试试看。让它工作起来,请参阅第一篇帖子。谢谢。@naike:更新这样的问题并不是你应该这么做的。旁注:没有任何理由在每个循环上重新创建您的
BufferedReader
。啊,在某个地方简要提到了这一点。为什么它会循环3次呢?换行符不是只有一个值吗?或者为什么它会占用3个缓冲区“空格”?在本例中,我将如何使用bufferedReader?@naike:在某些操作系统(如Windows)上,输入=
\r\n
,这是两个字符(回车[char 13]和换行[char 10])。重新查看BufferedReader,查看JavaDoc并尝试一下,再次意识到您将得到一个字符串而不是一个字符。如果你在上面花了一些时间后遇到了麻烦,请用你的
BufferedReader
代码发布一个新问题。谢谢,这澄清了一些问题,我会试试看。让它工作起来,请参阅第一篇帖子。谢谢。@naike:更新这样的问题并不是你应该这么做的。旁注:没有任何理由在每个循环上重新创建您的
BufferedReader