为什么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()。
- PortalUtil.getOriginalServletRequest和PortalUtil.getHttpServletRequest有什么区别?
- Hibernate多对多级联删除
- 阻止用户访问.jsp,除非转发
- 无法找到JAX-WS架构http://jax-ws.dev.java.net/spring/servlet.xsd
- 如何使用Selenium获取css类名?
- java / spring-在org.springframework.context.support.AbstractApplicationContext中获取NoClassDefFoundError
- 注释处理器,获取方法参数的修饰符
- 使用Struts2在JSP中访问Action类
- PropertyPlaceholderConfigurer从XML文件读取(Apache Commons配置)