我有以下代码:
import java.util.Scanner;
public class Practice {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//System.out.println("Enter quantity:");
//int quantity = input.nextInt();
//System.out.println("You entered: " + quantity);
//System.out.println("Enter price: ");
//double price = input.nextDouble();
//System.out.println("You entered: " + price);
System.out.println("Enter city: ");
String city = input.nextLine();
System.out.println("You entered: " + city);
System.out.println("Enter state code: ");
String state = input.next();
System.out.println("You entered: " + state);
}
}
当我运行程序中间部分这样注释时,它可以正常工作。但是,当我取消注释时,它会同时打印以下行来弄乱最后一个块:
Enter city:
You entered:
Enter state code:
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:1)
您输入的内容如下:
12<enter>1.3<enter>AZ
正确?
当您致电nextInt
时,它会读取下一个整数。所以它读为“12”,剩下的是:
<enter>1.3<enter>AZ<enter>
现在你致电nextDouble
。它跳过第一个&lt; enter&gt;并读取“1.3”(双倍)。剩下的是:
<enter>AZ<enter>
现在拨打nextLine
,直到下一个&lt; enter&gt;。哦,看,你已按下&lt; enter&gt;!所以它读取&lt; enter&gt;并返回一个空行。剩下的是:
AZ<enter>
现在再次致电nextLine
,直至下一个&lt; enter&gt;。它读取AZ<enter>
并返回“AZ”。
这是Scanner
和流如何工作的怪癖。通常的解决方法是在nextLine
和nextInt
之后立即致电nextDouble
,并忽略结果。类似的东西:
System.out.println("Enter quantity: ");
int quantity = input.nextInt();
input.nextLine(); // ignore newline
System.out.println("You entered: " + quantity);
System.out.println("Enter price: ");
double price = input.nextDouble();
input.nextLine(); // ignore newline
System.out.println("You entered: " + price);
答案 1 :(得分:0)
input.nextDouble();
不消耗该行,插入一行:input.nextLine();
在评论栏之后,不要将其分配给任何变量。
答案 2 :(得分:0)
使用ScnObj.next()代替ScnObj.nextLine();
System.out.println("Enter price: ");
double price = ScnObj.nextDouble();
System.out.println("You entered: " + price);
System.out.println("Enter city: ");
String city = ScnObj.next();
System.out.println("You entered: " + city);
System.out.println("Enter state code: ");
String state = ScnObj.next();
System.out.println("You entered: " + state);