为什么Scanner会跳过用户的输入

我有一个小任务,允许用户进入任何国家的地区和他们的邻居。

我做了一切,我只是遇到一个小问题,当我运行我的代码并且程序要求用户输入区域数量时,如果用户输入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); 

有什么帮助吗?

好的,很简单你的问题是你正在使用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()方法。

希望这可以帮助。

听起来每个按键都是一个输入。

您正在使用nextLine()来获取String,但我认为您应该使用next()。