为什么扫描仪会跳过用户的输入

2023-12-06

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

我做了所有的事情,只是有一个小问题,那就是当我运行我的代码时,程序要求用户输入区域的数量,如果用户输入 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(使用前将#替换为@)

为什么扫描仪会跳过用户的输入 的相关文章

随机推荐

  • Powershell监控多个目录

    注意 运行 PowerShell v3 我目前的目录设置是 ftproot 001 converted ftproot 001 inbound ftproot 001 pdf ftproot 002 converted ftproot 00
  • 使用函数依赖的关联参数限制

    对于给定类型 a 下面的函数 f 采用类型 c 的参数 对于不同类型的 a c 以不同的方式受到限制 具体来说 当 a 是任何整数类型时 c 应该允许是任何 实数 类型 当 a 为 Float 时 c 只能为 Float 一种尝试是 LAN
  • Websphere:web.xml 中的安全约束不起作用

    我想保护单个 jsp 页面免遭匿名访问 我正在尝试通过以下方式做到这一点
  • 有符号整型和无符号整型有什么区别

    有符号整型和无符号整型有什么区别 您可能知道 ints 在内部以二进制形式存储 通常是一个int包含 32 位 但在某些环境中可能包含 16 或 64 位 甚至不同的数字 通常但不一定是 2 的幂 但对于这个例子 我们来看 4 位整数 虽然
  • C# 7 模式匹配语义

    我有两个我认为是相等的代码块 First the if based block 然后完全相同 但转换为切换大小写类型 很抱歉 Resharper 红色波浪标记不好 Resharper 还不明白这一点 基于开关的代码将在第一个时抛出空引用异常
  • Spark 中的 DataFrame orderBy 后跟 limit

    我有一个程序生成一个 DataFrame 它将在其上运行类似的东西 Select Col1 Col2 orderBy ColX limit N 但是 当我最终收集数据时 我发现如果我采用足够大的前 N 个 则会导致驱动程序 OOM 另外另一
  • 从 Outlook 中的特定文件夹导入电子邮件

    我目前正在 Excel 中使用以下代码来访问无人值守的 Outlook 邮箱中的文件夹 而不是我自己的邮箱 但是 有没有一种方法可以在代码中设置文件夹 而不是使用文件夹选择器 Sub Launch Pad Dim olApp As Outl
  • 有没有办法从 GET 请求中删除提交按钮?

    我有一个可以查看的页面photos each photo是在一个album 在页面顶部我有一个albums选择框album id and album name分别
  • CORS 策略已阻止我的子域

    我有一个相同的域 其中一个是没有前缀 www 的域 例如 https www example com https example com 第一个域工作正常 因为它是默认域 但当我执行 CRUD 或访问任何 api 服务时 第二个出现错误 访
  • 无法预览此文件,应用程序可能已崩溃 -- 输入特定代码行时发生

    虽然我在堆栈溢出上四处寻找答案 但感觉我的情况对于这个错误来说是独一无二的 我一直在学习如何在 SwiftUI 中使用 CoreData 来保存持久数据 我首先制作一个基本的电影列表 当您单击 添加电影 按钮时 它会添加带有一些任意文本的电
  • Python:使用 numpy 或 scipy 读取 Fortran 二进制文件

    我正在尝试读取一个 fortran 文件 其标题为整数 然后实际数据为 32 位浮点数 使用 numpy 的fromfile mydatafile dtype np float32 它以 float32 形式读取整个文件 但我需要输出文件的
  • Json.NET,可以扩展SerializeXmlNode来检测数字吗?

    我正在使用以下方法从 XML 转换为 JSONSerializeXmlNode 看起来预期的行为是将所有 XML 值转换为字符串 但我想在适当的情况下发出真实的数值 Input
  • 在 C 中保留前导零 [重复]

    这个问题在这里已经有答案了 我试图在 c 中打印一个整数 但那些以零开头的整数引起了我的问题 例如如果没有 是 01234 它打印像 1234 而不是 01234 请告诉如何在 C 中做到这一点 我的问题是有 2 个整数 我想知道第一个整数
  • Django admin 保存对象的副本而不是覆盖

    我有一个名为 OneToOneFiled 的模型alg id 当我进入管理面板并更改现有对象中的此字段时 就会创建一个新对象 但我想用不同的对象覆盖相同的对象alg id 当我更改其他简单文本字段时 一切正常 如果我改变alg id对于一个
  • StringIndexOutOfBoundsException 字符串索引超出范围:0 [重复]

    这个问题在这里已经有答案了 我正在编写一个程序 打开一个文本文件并检查注释 然后它解析评论以检查某些单词 我遇到的错误是以下 while 循环 该循环检查当前行是否 如果存在非反斜杠字符 则以空格或 以外的任何字符开头 然后 while 循
  • KarateException 路径中缺少属性 - JSON

    我试图匹配响应中的特定变量并尝试如下 但我收到错误消息KarateException Missing Property in path Odata 我的问题是 我们如何修改才能避免出现此错误 Feature And match email
  • 如何使用 c#.net 4.0 在最大定义的并行线程中运行任务

    我有 1 个方法 我想在 10 个不同的并行线程中运行 所有方法都是独立的 彼此之间没有依赖关系 我的问题是 如果我有 100 个项目要处理并且想一次处理 10 个 那么如何做一次运行 10 次 我创建了一个示例代码 我正在使用Parall
  • URL 重写 - 初学者指南

    我需要学习如何对网站进行 URL 重写以获得漂亮的 URL 通过阅读 50 篇教程 我对它的工作原理有了一个大概的了解 但他们都没有真正发挥作用 也从未设法使其正常工作 您知道有哪些适合我入门的教程吗 这是我想如何使用它的示例 这是基本链接
  • 如何使用Dompdf转换多个html文件?

    我在做什么 我正在使用一个名为的 PHP 库Dompdf将我的 HTML 文件转换为 PDF 我已成功将单个 HTML 文件转换为 PDF 我正在尝试做的事情 现在我有多个报告 我想将它们转换为 PDF 文件 我在做什么 我在这里有一个示例
  • 为什么扫描仪会跳过用户的输入

    我有一个小任务 允许用户输入任何国家的地区及其邻居 我做了所有的事情 只是有一个小问题 那就是当我运行我的代码时 程序要求用户输入区域的数量 如果用户输入 13 或数字大于 10 系统会认为该数字就像两个输入 它不会允许用户为第二个问题输入