【问题标题】:Why output keeps same many output?为什么输出保持相同的输出?
【发布时间】:2019-02-27 02:11:05
【问题描述】:
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");
            }

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

【问题讨论】:

  • 当你输入yn 然后默认不会被执行,我想你知道的。
  • 当我输入 'b' 时,输出显示相同的单词 3 次。请问有什么建议吗?我只想看到一个输出...
  • @JamesGuy 输出什么?
  • 代码块到此结束了吗?发布 MVCE
  • This answerthis one also 可以帮助你

标签: java


【解决方案1】:

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

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

您可以考虑使用Scanner 来简化此操作。

【讨论】:

  • 我认为你是对的。这是他的问题....换行符。但是,我要指出的是,Mac 的行为与 Linux 一样,并且仅使用 '\n' 作为 EOL。我认为只是 Windows 将 '\r\n' 用于 EOL。 - 但这只是因为他可能会得到两个他可能没想到的额外字符而不是 1 个。
  • 我在本地进行了测试,在我的 Windows 机器上只看到了 '\n',所以我认为它在基于 Linux 的系统上是 "\r\n"。我想知道这是否只是 IntelliJ 控制台的事情。
  • 可能是 System.in 是以“字符模式”打开的,比如做 open("xxx", "r") 而不是 open("xxx", "rb")。在前一种情况下,Java 将所有系统上的流标准化为只返回“\n”。只有当您以“二进制模式”阅读时,您才可能得到“\n”以外的内容。我很确定你得到“\r\n”的一种方法是,如果你以“rb”模式打开一个 Windows 文件。 - 我打赌你总是从 System.in 中得到 '\n'。
【解决方案2】:

无限循环的原因是您从System.in.read() 读取输入并将其转换为char

System.in.read() 将在输入流结束时返回代码-1。如果将其转换为 char,则值为 65535

所以,请在下面添加这段代码: char name = (char) System.in.read();

System.out.println("name="+name);
char next = (char)System.in.read();
if(next==65535)
    break;

此代码对我有用。 https://ideone.com/ppk3Fi

【讨论】:

  • 嗯? System.in.read() 是如何到达“输入流的末尾”的?这与文件有关,但与标准输入无关。
  • @Steve 根据java doc read() 方法将在到达流结束时返回-1。
  • 我明白这一点。但是对于 System.in,“到达流的末尾”意味着什么? System.in 通常不会达到 EOS。它永远提供字符或块。
  • 哦,我明白你的意思了。输入流不会为空,因此read() 方法必须始终提供要返回的字节。在 openJDK 实现中,如果你没有设置InputStream in System.in,它将默认使用 BufferedInputStream。 BufferedInputStream重写read方法,当缓冲区为空时会返回-1
  • @Steve 我想知道输入流不能为空的原因。能否请您提供一些文档或任何关键字?
【解决方案3】:

这是我对此的看法。 改用 Scanner 类。

Scanner scanner = new Scanner (System.in);
System.out.println("please enter your name");
char name = scanner.next().charAt(0);

我会输入第一个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2013-03-26
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多