我的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);

    }

}

最佳答案

您拥有所谓的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:

“在匹配的输入之前前进”是指在换行符/回车符之前。

10-05 20:12