system.in.read错过执行

时间:2013-03-08 14:46:38

标签: java switch-statement

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

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

5 个答案:

答案 0 :(得分:4)

InputStream#read只读取一个byte并且不会使用换行符(在Windows平台上将是2个字符,LFCR),将其传递给下一个read。此read现在阻止收到输入,流程将落到您的default案例中。

您可以使用BufferedReader代替并阅读整行:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
...
int choice = Integer.parseInt(br.readLine());

答案 1 :(得分:2)

通过花时间阅读documentation,你会注意到这个方法只占用一个字节的数据。如果在输入数据后按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.
  }

答案 2 :(得分:1)

如果再次在某处打印选项,可能会得到10和13.

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

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

Reimeus,Chris Cooney已经展示了更好的输入方式。

答案 3 :(得分:0)

这是Infinite Loop。它将继续接受输入。

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

Scanner s = new Scanner(System.in);
while(true)
    {
        int choice = s.nextInt();
        if(choice == 1){
            break;
         }
    }
s.close();

答案 4 :(得分: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;
                }
            }
        }

    }
}