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

我的代码产生了意想不到的结果。 似乎我的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()?

目前您对Scanner#nextInt的调用不会消耗换行符,因此它将被传递给您第一次调用Scanner#nextLine ,因此它不会阻塞。

你需要添加

 get.nextLine(); 

在调用nextInt之后,第一次调用nextLine将阻止IO

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

 4 //this is it 1 

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

对我有用的是在每次迭代中实例化一个新的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; } 

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

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

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

  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];