为什么这个程序运行不正常?

时间:2015-01-18 07:22:48

标签: java user-input

我有以下代码:

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: 

为什么会发生这种情况,我该如何解决?

3 个答案:

答案 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和流如何工作的怪癖。通常的解决方法是在nextLinenextInt之后立即致电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);