我的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);
}
}
答案 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();
这应该清除您的扫描仪以进行下一次输入。
nextInt() - 将输入的下一个标记扫描为int。如果下一个标记无法转换为有效的int值,则此方法将抛出InputMismatchException,如下所述。如果翻译成功,扫描仪将超过匹配的输入。
&#34;在换行/回车之前,超过匹配&#34; 表示的输入。
答案 1 :(得分:0)
最好的解决方法是从scanner方法中删除elementType。通过这样做,可以防止循环的第一个实例清除输入,如上面的rolfl提到的那样。修改后的代码如下:
ObservableEmitter