我有一个小任务,允许用户输入任何国家的地区及其邻居。
我做了所有的事情,只是有一个小问题,那就是当我运行我的代码时,程序要求用户输入区域的数量,如果用户输入 13 或数字大于 10,系统会认为该数字就像两个输入,它不会允许用户为第二个问题输入任何内容,并且会立即提示他第三个问题。为什么?
我认为以下命令中的 Scanner 类存在问题:
Scanner kb = new Scanner(System.in);
System.out.print("Please enter the number of regions: ");
int REGION_COUNT = kb.nextInt();
region = new CountryRegion[REGION_COUNT];
String[] neighbours;
for (int r = 0; r < region.length; r++) {
System.out.print("Please enter the name of region #" + (r + 1) + ": ");
String regionName = kb.nextLine();
System.out.print("How many neighbors for region #" + (r + 1) + ": ");
if (kb.hasNextInt()) {
int size = kb.nextInt();
neighbours = new String[size];
for (int n = 0; n < size; n++) {
System.out.print("Please enter the neighbour #" + (n + 1) + ": ");
neighbours [n] = kb.nextLine();
}
region [r] = new CountryRegion(regionName, neighbours);
}
else
System.exit(0);
}
for (int i = 0; i < REGION_COUNT; i++) {
System.out.print(region[i].getRegionName() +": ");
for (int k = 0; k < region[i].getRegionAjesint().length; k++) {
System.out.print(region[i].getRegionAjesint()[k] +", ");
}
System.out.println();
}
mapColor = new MapColor(region);
有什么帮助吗?
好的,很简单,你的问题是你正在使用nextInt()
Scanner 类的方法,然后使用nextLine()
这两种方法都使用相同的缓冲区,这就是发生的情况。
当您在键盘中输入您要求的数字(假设 10)时,您实际输入的数字
10 和回车键(换行符(\n
))
The nextInt()
Scanner 类中的方法将读取 10,并且仅读取 10,这意味着新行字符 (\n
)仍然在键盘缓冲区中,接下来在你的代码中你有一个nextLine()
这将读取所有内容直到新行(\n
),您已经在缓冲区中了!
所以这一切的运作方式是nextLine()
方法考虑换行符(\n
) 在输入时保留在缓冲区中,并且 for 继续循环的下一次迭代。
问题的解决方案是清除新行字符的缓冲区(\n
)你可以通过调用来实现这一点nextLine()
代码中实际方法之前的方法,如下所示:
...
int REGION_COUNT = kb.nextInt();
region = new CountryRegion[REGION_COUNT];
String[] neighbours;
kb.nextLine(); //CLEAR THE KEYBOARD BUFFER
for (int r = 0; r < region.length; r++) {
System.out.print("Please enter the name of region #" + (r + 1) + ": ");
String regionName = kb.nextLine();
...
这样一来nextLine()
调用从缓冲区中提取新行字符,清除它,并且由于它不存储它,因此它被丢弃,为您留下一个新行字符空闲缓冲区,准备好接收来自用户的完整输入nextLine()
method.
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)