为什么我的for循环中的提示第一次打印两次?

时间:2014-10-02 03:45:05

标签: java for-loop printing

我的for循环中的第一个print语句打印两次,然后继续下一行。但是之后它会像之后那样贯穿循环?

我尝试使用我的调试器,但我以前从未使用过它,我们没有在任何课程中使用它而且我不太确定我在做什么

public static void main(String[] args) 
{
    int numElements;

    Scanner keyboard = new Scanner(System.in);

    System.out.println("How many people are you adding: ");
    numElements = keyboard.nextInt();
    ArrayBndQueue queue = new ArrayBndQueue<>(numElements + 1);

    for(int index =0; index <= numElements; index++)
    {
        System.out.println("Enter a gender and name (ex: f jenny)");
        String name = keyboard.nextLine();
        System.out.println(name);
        queue.enqueue(name);

    }

}  

2 个答案:

答案 0 :(得分:13)

您拥有名为an off-by-one error的内容。许多语言的基础之一是它们在索引时是零基础的。你有一半的权利,你有一个错误(实际上是两个),而不是修复那个错误,你只修复了症状....

关闭一个错误

错误在你的for循环中:

for(int index =0; index <= numElements; index++)

如果循环次数过多......在测试条件下应使用<而不是<=。这样你就会循环numElements次。

不是修复它,而是使队列1元素太大,所以你应该改变:

ArrayBndQueue queue = new ArrayBndQueue<>(numElements + 1);

是:

ArrayBndQueue queue = new ArrayBndQueue<>(numElements);

那应该排除额外的循环,你仍然可以为这些值留出空间。

扫描仪管理错误

Scanner.nextInt()仅从扫描仪中提取int值,而不是终止换行符/回车符,因此当您在循环中调用nextLine()时,它会清除已在扫描仪中的行,而不是等待输入。

您必须先清除扫描仪中的行,然后才能在nextInt()通话后前进:

numElements = keyboard.nextInt();
keyboard.nextLine();

这应该清除您的扫描仪以进行下一次输入。

来自the documentation

  

nextInt() - 将输入的下一个标记扫描为int。如果下一个标记无法转换为有效的int值,则此方法将抛出InputMismatchException,如下所述。如果翻译成功,扫描仪将超过匹配的输入。

&#34;在换行/回车之前,超过匹配&#34; 表示的输入。

答案 1 :(得分:0)

最好的解决方法是从scanner方法中删除elementType。通过这样做,可以防止循环的第一个实例清除输入,如上面的rolfl提到的那样。修改后的代码如下:

ObservableEmitter