Java system.in.读取未命中执行

Java system.in.读取未命中执行,java,switch-statement,Java,Switch Statement,为什么在第一个循环之后,开关将执行两次,然后停止等待我的输入?标准输入中是否还有字符?我如何解决这个问题 while(true) { int choice = System.in.read(); switch(choice) { case '1': break; default: break; } } 这是一个无限循环。它将继续接受输入 您应该使用扫描仪获取输入,而不是System.in.read,如下所示:- Scanner s = new Scann

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

while(true)
{
int choice = System.in.read();
switch(choice)
{
   case '1':
       break;
   default:
       break;
}
}
这是一个无限循环。它将继续接受输入

您应该使用扫描仪获取输入,而不是System.in.read,如下所示:-

Scanner s = new Scanner(System.in);
while(true)
    {
        int choice = s.nextInt();
        if(choice == 1){
            break;
         }
    }
s.close();
只读取一个字节,不使用换行符。在Windows平台上,换行符将为2个字符,LF和CR,并将其传递给下一次读取。此读取现在不会阻止接收到输入,并且流将进入默认情况

您可以改为使用BufferedReader并读取整行:

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

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

范例

在这种情况下,可以使用Break to TABLED语句。更多信息

以下是工作代码:


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

“10”是左前进线控制字符。 “13”是CR车厢返回控制字符。 这就是开关执行两次的原因


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

你为什么不做一些调查并打印出你收到的字符?我猜你是在按enter键,在Windows系统上有两个字符:0x0D和0x0A。你应该避免在循环中创建扫描仪,因为它是自动关闭的,并且在第一次迭代后关闭输入流。我在linux上,你是说system.in.read会在linux中使用LF吗?是的,确实,您可以通过查找System.getPropertyline.SeparatorTanks来检查这一点!我还是有点困惑。我看到文档说inputstream.read,它是system.in.read,读取一个字节,而inputStreamReader.read读取一个字符。那么,在linux中,这意味着一个字符由1字节表示吗?但是当我输入一个字符时,它是由“a/n”组成的吗?java中是否有类似sizeof的函数来查看您获取的内容的实际大小否,因为它是ASCII字符,所以仍然只有一个字节。由于Java是行缓冲的,所以换行符会自动跟随。通过读取该行并解析,LF被删除。要使用readLine获取大小,请对返回的字符串使用length。
  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.
  }
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;
                }
            }
        }

    }
}