0

为什么在第一个循环之后,开关会在停止等待我的输入之前执行两次?标准输入中是否有任何字符?我该如何解决这个问题?

while(true)
{
int choice = System.in.read();
switch(choice)
{
   case '1':
       break;
   default:
       break;
}
}
4

5 回答 5

4

InputStream#read只读取一个byte并且不会消耗换行符(将是 2 个字符,LFCRWindows 平台上),将其传递给下一个read. read现在这不会阻止收到输入,并且流程将流向您的default案例。

您可以改用 aBufferedReader并阅读整行:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
...
int choice = Integer.parseInt(br.readLine());
于 2013-03-08T14:52:07.073 回答
2

通过花时间阅读文档,您会注意到此方法接收单个字节的数据。如果您在输入数据后按 Enter 键,则会向System.in流中添加另一个字节,这意味着 Switch 语句有更多数据可供使用。您应该使用Scanner来读取这样的流。

例子

  Scanner s = new Scanner(System.in);
  // Create a scanner object that reads the System.in stream.
  int choice = s.nextInt();
  // Accept the next int from the scanner.
  switch(choice)
  {
    // Insert selection logic here.
  }
于 2013-03-08T14:53:38.167 回答
1

如果您再次在某处打印选择,可能会得到 10 和 13。

  • '10' 是 LF(换行控制字符)。
  • '13' 是 CR(回车控制字符)。

这就是开关执行两次的原因。

And the better way of taking input already have been shown by Reimeus, Chris Cooney.

于 2013-03-08T15:02:37.227 回答
0

这是一个Infinite Loop. 它只会继续接受输入。

您应该使用 aScanner来获取您的输入,而不是System.in.read(),如下所示:-

Scanner s = new Scanner(System.in);
while(true)
    {
        int choice = s.nextInt();
        if(choice == 1){
            break;
         }
    }
s.close();
于 2013-03-08T14:48:59.090 回答
0

在这种情况下,您可以使用Break to Labeled Statement 。更多信息http://www.javaspecialists.eu/archive/Issue110.html

这是工作代码:

import java.io.IOException;

public class Switch {

    public static void main(String[] args) throws IOException {
        exitWhile: {
            while (true) {
                System.out.println("type>");
                int choice = System.in.read();

                switch (choice) {
                case '1':
                    break;
                default:
                    System.out.println("Default");
                    break exitWhile;
                }
            }
        }

    }
}
于 2013-03-08T14:54:20.727 回答