为什么首先跳过循环迭代?

时间:2013-02-05 18:25:38

标签: java

我的代码产生了意想不到的结果。似乎我的for循环跳过了第一次迭代,我不明白为什么。

public static void main(String[] args) {

    Scanner get = new Scanner(System.in);
    int number;

    // Ex.1.

    String family_name;
    String[] family_array;

    System.out.println("Enter number of family members: ");
    number = get.nextInt();
    family_array = new String[number];

    for(int i = 0; i < number; i++){
        System.out.println("Enter family member name: ");
        family_name = get.nextLine();
        family_array[i] = family_name;
    }

    for(int i = 0; i < number; i++){
        System.out.println(family_array[i]);
    }

}

返回...(假设数字输入是名称)

Enter number of family members: 
5
Enter family member name: 
Enter family member name: 
1
Enter family member name: 
2
Enter family member name: 
3
Enter family member name: 
4

1
2
3
4

为什么跳过第一个get.nextLine()?

5 个答案:

答案 0 :(得分:5)

目前,您对Scanner#nextInt的调用并未使用换行符,因此会在第一次调用Scanner#nextLine时将其传递给您,因此它阻止。

您需要添加

get.nextLine();

致电nextInt后,您第一次拨打nextLine将阻止IO

答案 1 :(得分:3)

请注意4和1之间的空行?

4
       //this is it
1

当你调用get.NextInt()时,你不会吃整行,只是下一个int。在第一次循环迭代中吃剩下的空行。在读取int之后添加对get.nextLine()的调用。

答案 2 :(得分:0)

对我来说有用的是在每次迭代中实例化一个新的Scanner

for(int i = 0; i < number; i++)
{
    System.out.println("Enter family member name: ");

    Scanner loopGet = new Scanner(System.in);
    family_name = loopGet.nextLine();
    family_array[i] = family_name;
}

答案 3 :(得分:0)

    number = get.nextInt();
     // if i enter 4 then it will 4\n and nextInt will take only 4 
     // and the \n will be taken as input by the getline.
    get.nextLine();  
     //this will return the "" from ""\n . so adding this will solve your problem
    family_array = new String[number];

答案 4 :(得分:0)

我要说这是因为你还有一个缓冲的CR / LF - 所以第一个被设置为空白。在打印姓氏(数字)时请注意空白行。那是你的空白姓氏。

键盘输入是一个缓冲流 - 它有你的5,它有一个CR / LF(或者只是一个LF,取决于你的操作系统)。

您可能想要获取LINE然后执行string.convert,atoi,system.convert(无论哪个是Java)来获取#。