下面是我的代码:
do{
sc.nextLine();
System.out.println("What kind of operation do you want to do?");
String res=sc.nextLine();
switch(res){
//cases
default:System.out.println("Invalid input");
}
System.out.print("Do you want to do any other operation? 1/0...");
ans=sc.nextShort();
}while(ans==1);
每当我尝试执行该块时,第一个操作都很好,但当我输入1执行其他操作时,系统不会询问我“您要执行哪种操作”,而是直接显示“无效输入”。
3条答案
按热度按时间h7appiyu1#
这是
Scanner
的一个已知问题。我不知道细节,但是当你读一个像scan.nextInt()
这样的数字,然后你想读一个像scan.next()
这样的字符串时,你应该在Scanner
中执行scan.nextLine()
来切换上下文或smth。ukdjmx9f2#
我在不同IDE的控制台上看到过关于
Scanner
的不同问题。我所做的总是使用scanner.nextLine()
读取并解析为所需的类型。这样我们也可以验证输入并显示一个用户友好的错误,而不是Scanner
在它期望nextInt()
时抛出异常,但却得到了其他东西。ulydmbyx3#
这是因为
nextShort
(或int、long或其他类型)读取所有字节以生成该类型。看看这个程序:
如果我输入
打印
这是因为第一个
scanner.nextInt()
读取字符5
,后面的scanner.nextLine()
读取到第一行的末尾(剩余一个空字符串),第二个nextLine()
读取第二行。这种情况下的输入字符串也可以可视化为:
5\nhello\n
扫描仪从位置0开始nextInt()
读取并将光标移动到位置1(数字的末尾),nextLine()
读取并移动到索引2(第一个\n
),第二个移动到位置8使用不同的输入可以看到该行为:
(so(一个月九个月)
打印输出:
(mind
hello
之前空格)如其他响应中所述,您应该在
nextShort()
之后也使用nextLine()
,请参见nextLine()
,就像等待用户打印回车一样