do ...中的第一行代码在第二次进入循环时跳过while循环 - Java

时间:2017-06-22 20:07:03

标签: java loops

这是我的代码

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        int[] data = new int[10];
        int count = 0;

         do {
             System.out.print("Enter a number or ctrl + z when you are done: ");
             data[count] = input.nextInt();
         }
         while (input.hasNextDouble());
    }
}

输出

Enter a number or ctrl + z when you are done: 2
4
Enter a number or ctrl + z when you are done: 6
Enter a number or ctrl + z when you are done: 8

我的问题是,当我第二次进入循环时,我不知道为什么代码会在System.out.print("Enter a number or ctrl + z when you are done: ");之后跳过do {。这可以在输出的第二行看到。请问我做错了什么?

我搜索了我的问题可能已经得到解答但只能找到与代码跳过相关的解决方案的案例nextLine()

3 个答案:

答案 0 :(得分:2)

原因是第一次执行do块,然后检查while中的条件。

关于orcale doc中的hasNextDouble()

  

如果此扫描仪输入中的下一个标记可以,则返回true   使用nextDouble()方法解释为double值。该   扫描仪不会超过任何输入。

作为解决方案,您可以更改以下条件:

do {
     System.out.print("Enter a number or ctrl + z when you are done: ");
     data[count] = input.nextInt();
     count++;
 }
 while (count < 10);

此外:

如果您使用input.nextInt();,最好使用hasNextInt()进行检查。

答案 1 :(得分:1)

啊你的while循环正在等待输入hasNextDouble()

在用户输入下一个双精度或点击ctrl-z之前,它怎么知道?

你必须做一些丑陋的事情

System.out.print("Enter a number or ctrl + z when you are done: ");
do {
  data[count++] = input.nextInt();
  System.out.print("Enter a number or ctrl + z when you are done: ");
}
while (input.hasNextDouble());

请注意上面的count ++以及我认为它修复了另一个错误。

答案 2 :(得分:0)

这是因为第一次调用input.hasNextDouble()会等待输入数字。

因此循环的第二次迭代中的消息不会出现,直到循环第一次迭代结束时input.hasNextDouble()为止。 run - 当然会获取第二个数字。

您需要在之前打印消息hasNextDoublehasNextInt