【问题标题】:first line of code in do...while loop skipped while entering the loop the second time - Javado...while 循环中的第一行代码在第二次进入循环时跳过 - Java
【发布时间】:2017-06-23 04:36:57
【问题描述】:

这是我的代码

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

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

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

【问题讨论】:

标签: java loops


【解决方案1】:

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

关于hasNextDouble() in orcale doc

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

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

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() 进行检查。

【讨论】:

  • 我没有投反对票,因为我认为您没有回答这个问题。 OP问“我的问题是我不知道为什么代码会跳转......”和“......请问我做错了什么?”。我认为你没有处理过这两个问题。你的第一句话“原因是第一次执行块然后检查条件”对我来说完全无法理解。
【解决方案2】:

你的 while 循环正在等待查看输入是否 hasNextDouble()

在您的用户输入下一个 double 或按 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++,我认为它修复了另一个错误。

【讨论】:

  • 非常感谢,因为您的回答,我现在明白了我的问题出在哪里。太棒了:)
【解决方案3】:

发生这种情况是因为对input.hasNextDouble() 的第一次调用会在继续之前等待输入数字。

因此,循环的 second 迭代中的消息直到循环的 first 迭代结束时的 input.hasNextDouble() 运行后才会出现 - 哪个当然会获取第二个数字。

您需要在调用hasNextDoublehasNextInt 之前打印消息

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多