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

时间:2010-12-30 20:04:42

标签: java java.util.scanner

我有一项小任务,允许用户输入任何国家/地区的区域及其邻居。

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

请帮忙吗?

3 个答案:

答案 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()。