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;
}
}
}
}
}