为什么在第一个循环之后,开关会在停止等待我的输入之前执行两次?标准输入中是否有任何字符?我该如何解决这个问题?
while(true)
{
int choice = System.in.read();
switch(choice)
{
case '1':
break;
default:
break;
}
}
为什么在第一个循环之后,开关会在停止等待我的输入之前执行两次?标准输入中是否有任何字符?我该如何解决这个问题?
while(true)
{
int choice = System.in.read();
switch(choice)
{
case '1':
break;
default:
break;
}
}
InputStream#read只读取一个byte
并且不会消耗换行符(将是 2 个字符,LF
在CR
Windows 平台上),将其传递给下一个read
. read
现在这不会阻止收到输入,并且流程将流向您的default
案例。
您可以改用 aBufferedReader
并阅读整行:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
...
int choice = Integer.parseInt(br.readLine());
通过花时间阅读文档,您会注意到此方法接收单个字节的数据。如果您在输入数据后按 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.
}
如果您再次在某处打印选择,可能会得到 10 和 13。
这就是开关执行两次的原因。
And the better way of taking input already have been shown by Reimeus, Chris Cooney.
这是一个Infinite Loop
. 它只会继续接受输入。
您应该使用 aScanner
来获取您的输入,而不是System.in.read()
,如下所示:-
Scanner s = new Scanner(System.in);
while(true)
{
int choice = s.nextInt();
if(choice == 1){
break;
}
}
s.close();
在这种情况下,您可以使用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;
}
}
}
}
}