在java中使用字符时的一些逻辑错误

在java中使用字符时的一些逻辑错误,java,string-comparison,Java,String Comparison,这是我的密码 class info{ public static void main (String[]args) throws IOException{ char gen; while(true) { //problem occurs with this while System.out.print("\nENTER YOUR GENDER (M/F) : "); gen=(char)System.i

这是我的密码

class info{
    public static void main (String[]args) throws IOException{
        char gen;

        while(true) {   //problem occurs with this while
            System.out.print("\nENTER YOUR GENDER (M/F) : ");
            gen=(char)System.in.read();

            if(gen=='M' || gen=='F' || gen=='m' || gen=='f'){
                break;
            }
        }

        System.out.println("\nGENDER = "+gen);
    }
}
这是我的输出

ENTER YOUR GENDER (M/F) : h

ENTER YOUR GENDER (M/F) :
ENTER YOUR GENDER (M/F) :
ENTER YOUR GENDER (M/F) : m

GENDER = m

有人能帮我理解为什么它多次询问性别。

您在按下
h
后按下了return;在这样做之前,您不会看到
'h'
,但在看到下一个字符之前,您仍然会看到返回(从外观上看,返回的字符可能是两个字符,可能是
'\r'
'\n'

您可能希望一次读取一行文本,而不是单个字符-您只会在用户按return键时看到输入,这意味着您不需要担心这一特定方面


您可以使用
Scanner
BufferedReader
包装
系统。在
中,您可能正在Windows上工作。当您给出答案并按enter键时,它会额外添加两个字符
'\r'
'\n'
。从
stdin
只能接收一个字符,但多余的两个字符仍保留在缓冲区中。当您给出错误的答案时,您将循环并自动从缓冲区读取这两个字符。他们不匹配的性别,所以循环继续。最好的解决方案是分析字符串而不是字符:

InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
String s = in.readLine();

请记住在字符串比较中使用
equals
方法而不是
=

使用
Scanner scan=new Scanner(System.in)

这是您的代码的工作版本

public class Info{


        public static void main (String[]args) throws IOException{

        char gen;
            Scanner scan = new Scanner(System.in);          // Change made here

            while(true) {  

                System.out.print("\nENTER YOUR GENDER (M/F) : ");

                gen= scan.next().charAt(0);             // Change made here

                if(gen=='M' || gen=='F' || gen=='m' || gen=='f'){
                    break;
                }
                else{                                 // Change made here
                    System.out.println();
                    System.out.println("Your Option is not Available, pls try again");
                    continue;
                }
            }

            System.out.println("\nGENDER = "+gen);
        }
    }

您可以编辑您的问题(问题下方的链接)以添加代码,而不是将其作为注释发布-这样看起来会更好!好啊thanx。。。事实上,我也是新手。谢谢你。。。在这里,我还必须添加一些包吗?你能解释一下这两个字符自动添加的原因吗?每个字符(甚至不可打印)都有自己的字节表示。其中一些(人们经常使用)也有它们的助记符号。例如,新行是
\n
,选项卡是
\t
等。当应用程序读取您的输入并按enter键时,它将接收“text\n”。在Windows中,自动添加
\n
之前的
\r
。所以您有:“text\r\n”。当您一个字符接一个字符地阅读消息时,您必须记住这些字符也是作为输入添加的。键入“h”时,输入缓冲区中的实际内容是“h\r\n”。您在char之后读取缓冲区中的char,因此在“h”之后将得到
\r
\n
。您可以使用break label帮助我完成上面编写的代码吗?。。。详细信息已经在那里给出了…@HimanshuAggarwal:使用
新扫描仪(System.in)
然后从中读取行。好的。。。我明白了,谢谢。。。事实上,我知道从方法nextLine()输入字符串的方法,但不知道哪个方法会占用字符。。。在这件事上你能帮我吗???先生,有一个小小的疑问,为什么我们在Scanner构造函数中将System.in作为参数传递,为什么我们不将其留空?我知道从方法nextLine()输入字符串的方法,但不知道任何方法,因为它占用了字符。。。在这件事上你也能帮我吗?