当前位置: 首页 > 知识库问答 >
问题:

扫描仪的nextLine()问题

拓拔弘化
2023-03-14

我有两个do-while循环用于进行自定义输入验证。问题是它会自动进入下一个do while循环。正确插入名称后,我必须放置一个新的下一行():name=scanner。nextLine()

我知道当光标停留在那里时,nextLine()会出现“小故障”,您必须调用nextLine()才能继续。资料来源:https://www.geeksforgeeks.org/why-is-scanner-skipping-nextline-after-use-of-other-next-functions/

但事实并非如此。很明显我错过了什么。。。

String name = "";
boolean flag_name= false;
do{
    System.out.print("Name: ");
    if(scanner.hasNextInt()){
        System.out.println(scanner.nextInt() + " That's not a valid name...\n");
        scanner.nextLine();
    }else{
        name = scanner.nextLine();
        flag_name = true;
    }
}while(!flag_name);

int age = 0;
boolean good_age = false;
do {
    System.out.print("Age: ");
    if (!scanner.hasNextInt()){
        System.out.println("That's not a valid age.");
    }else if(scanner.nextInt() <= 3 || scanner.nextInt() >= 125) {
        System.out.println("You must be over 3yo.");
        scanner.nextLine();
    }else{
        age = Integer.parseInt(scanner.nextLine());
        good_age = true;
    }
}while (!good_age);

输出:

Name: mark
Age: 'mark' That's not a valid age.
Age: 

共有1个答案

常鸿朗
2023-03-14

我终于发现我已经带了一个乱七八糟的扫描仪。在上一步中,我有一个无人值守的扫描器。下一步() 使得它之后的一切行为都不稳定。

System.out.print("Insert an option (1,2,3): ");
input = scanner.next();
// changed:
input = scanner.nextLine();

修复了后续步骤的扫描仪。

我还应用了@AppleCiderGuy提到的逻辑并修复了我的第二个do-time循环。

最终代码:

String name = "";
boolean flag_name= false;
do{
    System.out.print("Name: ");
    if(scanner.hasNextInt()){
        System.out.println("That's not a valid name...");
        scanner.nextLine();
    }else{
        name = scanner.nextLine();
        flag_name = true;
    }
}while(!flag_name);

int age = 0;
boolean good_age = false;
do {
    System.out.print("Age: ");
    if (!scanner.hasNextInt()) {
        System.out.println("That's not a valid age.");
        scanner.nextLine();
    }else{
        age = Integer.parseInt(scanner.nextLine());
        if(age <= 3 || age >= 125) {
            System.out.println("You must be over 3yo.");
        }else{
            good_age = true;
        }
    }
}while (!good_age);

经验教训:

  1. 您将始终需要一个scanner.nextLine();,用于在到达错误输入时清理扫描仪。否则,不正确的输入将留在扫描仪中并弄乱后续代码
  2. 当您使用整数时,即使正确分配给变量,您也需要清理扫描仪。对我来说,使用Integer.parseInt(scanner.nextLine());更容易。
  3. 始终尝试评估变量而不是scanner.next*方法。因为扫描仪将等待更多输入。

谢谢

 类似资料:
  • 在Java方面,我是一个业余爱好者,所以请原谅我的问题,如果它看起来很愚蠢:-P我有以下代码,旨在计算文件中的行数: 所以它很好,但我想将扫描仪重新用于其他目的,但nextLine已移动到文件的最后一行,我想将其重置回第一行。 (取而代之的是,我不得不使用另一台扫描仪来实现另一个目的,而在我看来,这似乎没有它应有的优雅。) 我肯定肯定有一种扫描仪方法可以将计数器重置为零? 谢谢 CJ

  • 一段时间以来,我一直在做一个作为拼字字典的编程作业。该程序接受用户的输入,并输出一个包含单词列表的文件,这取决于用户从菜单中请求的内容。我遇到的问题与Scanner.nextLine()有关。 我不是很清楚为什么,但由于某种原因,有时我必须按一次enter键,然后我的代码才会接受我的输入并将其存储为变量。本质上,我最终输入了两次输入。我尝试在代码周围插入Scanner.nextLine()以“占用

  • < b >想改进这个问题?更新问题,以便通过编辑此帖子用事实和引用来回答问题。 我知道使用nextInt()方法不会消耗新行字符,所以为了处理这个问题,我需要使用一个空的nextLine()方法继续。 我的问题是,作为一种替代解决方案,程序是否会对任何类型的运行时错误开放以使用两个扫描仪,一个用于字符串输入,一个用于整数? 感谢您的任何帮助! (经过编辑,因此问题不那么主观)

  • 问题内容: 如何将扫描仪的定界符设置为;或换行? 我试过: 但这不起作用。 问题答案: 通常,在模式中,您需要将翻倍。 所以,尝试 要么 编辑 :如果是问题,则可能要尝试以下操作: 它匹配的一个或多个,和。 注意 :我还没有尝试过这些。

  • 问题内容: 我正在尝试读取具有多个单词的字符串,即。洛杉矶或纽约市。如果有两个词并将它们分割在变量之间,则使用scanner.next()进行“出发”和“到达”只会读取第一个。nextLine()也不是很幸运。这是我的代码: 我知道这很简单,但我还没有弄清楚。 这是上面的代码的输入/输出: 输入航班号:29 输入出发城市:(立即跳至下一行) 输入到达城市: -—我真正想要的是---- 输入航班号: