为什么在第一次循环之后,开关会在停止等待输入之前执行两次?标准输入中是否还有字符?我该如何解决这个问题?
while(true)
{
int choice = System.in.read();
switch(choice)
{
case '1':
break;
default:
break;
}
}
答案 0 :(得分:4)
InputStream#read只读取一个byte
并且不会使用换行符(在Windows平台上将是2个字符,LF
和CR
),将其传递给下一个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.
这就是开关执行两次的原因。
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;
}
}
}
}
}