Java 为什么输出保持相同的多个输出?

Java 为什么输出保持相同的多个输出?,java,Java,当我输入除y或n以外的其他键时,会有多个相同的输出不断出现。有什么建议吗?我只想看到一个输出,并且System.in.read()是必须的。不是扫描仪。您正在使用System.in.read()读入下一个字符,但当您键入字符并按enter键时,实际上输入了三个字符:键入的字符、回车符('\r')和换行符('\n')。我假设你在Mac电脑上,因为Windows机器只使用换行符 由于您在while循环中,因此它会一直读取,直到您找到将yn设置为true的有效字符为止 你可以考虑使用扫描器使这更容易。

当我输入除
y
n
以外的其他键时,会有多个相同的输出不断出现。有什么建议吗?我只想看到一个输出,并且
System.in.read()
是必须的。不是扫描仪。

您正在使用
System.in.read()
读入下一个字符,但当您键入字符并按enter键时,实际上输入了三个字符:键入的字符、回车符('\r')和换行符('\n')。我假设你在Mac电脑上,因为Windows机器只使用换行符

由于您在
while
循环中,因此它会一直读取,直到您找到将
yn
设置为
true
的有效字符为止


你可以考虑使用<代码>扫描器使这更容易。

无限循环的原因是你从<代码>系统中读取输入。in .Read()/Cult>并将其转换成<代码> char < /P>
System.in.read()
将在输入流结束时返回code
-1
。如果将其转换为
char
,则值将为
65535

因此,请在以下内容之后添加此代码:
char name=(char)System.in.read()

System.out.println(“name=“+name”);
char next=(char)System.in.read();
如果(下一个==65535)
打破
这个代码对我有用。 这是我对这个问题的看法。 改为使用Scanner类

boolean yn = true;
        while(yn)
        {
            System.out.println("please enter your name");
            char name = (char) System.in.read();
            switch(name)
            {
                case 'y':
                    yn = false;
                    break;
                case 'Y':
                    yn = false;
                    break;
                case 'n':
                    yn = false;
                    break;
                case 'N':
                    yn = false;
                    break;
                default:
                    System.out.println("You did not input a correct choice");
            }

我想我会输入第一个字符。

当你输入
y
n
时,默认值不会被执行,我想你知道。当我输入“b”时,输出显示相同的单词3次。有什么建议吗?我只想看到一个输出…@JamesGuy什么输出?这是代码块的结尾吗?发布MVCE,可能会对你有所帮助我认为你是对的。这是他的问题…新行字符。不过,我要指出的是,Mac的行为与Linux一样,只使用“\n”作为EOL。我以为只是Windows在EOL中使用了'\r\n'但这仅仅是因为他可能会得到两个他可能不期望的额外字符,而不是1。我在本地测试时,在我的Windows计算机上只看到了“\n”,所以我假设在基于Linux的系统上是“\r\n”。我想知道这是否只是一个IntelliJ控制台的东西。可能是System.in是以“字符模式”打开的,就像打开(“xxx”,“r”)而不是打开(“xxx”,“rb”)。在前一种情况下,Java将所有系统上的流标准化为只返回'\n'。只有在“二进制模式”下读取时,才可能得到“\n”以外的内容。我非常确定的一种方法是,如果您以“rb”模式打开Windows文件,则会得到“\r\n”。-我打赌你总是从System.in.得到“\n”?嗯?System.in.read()如何每次到达“输入流的末尾”?这与文件有关,但不是标准输入。@Steve根据read()方法,当到达流的末尾时将返回-1。我理解这一点。但“到达流的尽头”对System.in意味着什么?对于System.in,通常无法到达EOS。它永远提供字符或块。哦,我明白你的意思。输入流不会为空,因此
read()
方法必须始终提供要返回的字节。在openJDK实现中,如果您没有在System.In
中设置
InputStream,它将默认使用BufferedInputStream。BufferedInputStream重写方法,当缓冲区为空时,它将返回
-1
。@Steve我想知道输入流不能为空的原因。你能给我一些文件或任何关键词吗??
Scanner scanner = new Scanner (System.in);
System.out.println("please enter your name");
char name = scanner.next().charAt(0);