我有一项小任务,允许用户输入任何国家/地区的区域及其邻居。
我做了所有事情,我只是遇到一个小问题,当我运行我的代码并且程序要求用户输入区域数量时,如果用户输入13或者数字大于10,系统将考虑number就像两个输入,它不允许用户为第二个问题输入任何内容,它会立即提示他第三个问题。为什么呢?
我认为以下命令中的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);
请帮忙吗?
答案 0 :(得分:3)
好的,很简单你的问题是你正在使用Scanner类的nextInt()
方法,然后使用nextLine()
方法,这两种方法都使用相同的缓冲区,这就是正在发生的事情。
当您输入实际进入的键盘中要求(比如说10)的数字时
10和回车键(换行符(
\n
))
Scanner类中的nextInt()
方法将读取10和10,这意味着新行字符(\n
)仍然在键盘缓冲区中,然后在您的代码中有一个nextLine()
将读取所有内容(\n
),你已经在缓冲区中了!
所以这一切的工作方式是nextLine()
方法考虑缓冲区中剩下的新行字符(\n
)作为它的输入,并继续循环的下一次迭代。
您的问题的解决方案是清除新行字符(\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()
方法中的用户。
希望这有帮助。
答案 1 :(得分:1)
听起来每次按键都是一个输入。
答案 2 :(得分:0)
您正在使用nextLine()来获取String,但我认为您应该使用next()。