我的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:
“在匹配的输入之前前进”是指在换行符/回车符之前。