Java - 当我在输入字符串数据之前输入字符串数据时,扫描器仅执行 Int 和 "skip" 字符串数据类型

Java - Scanner execute only the Int and "skip" the Strings data types when i input String data before the Int ones

当我使用 java.util.Scanner 时,我尝试在数据输入中使用整数和 Strings。

我遇到的问题是,当我在输入 String 数据之前输入 Int 数据时,控制台会跳过 String 数据并立即转到下一个 Int 数据。

这是我发生问题的简单问题:

package justForTest;

import java.util.Scanner;

public class EmptySpaceWorkshop {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.print("- Enter your Name : ");
        String name = input.nextLine();

        System.out.print("- Enter your IC number : ");
        int icNumber = input.nextInt();

        System.out.print("- Enter your Place of birth : ");
        String placeOfBirth = input.nextLine();

        System.out.print("- Enter your Age : ");
        int age = input.nextInt();

        System.out.println("There once was a wonderful person named " + name+ ", His IC number is " + icNumber );

        System.out.println(". He/She is " + age + " years old. She/He was born at " + placeOfBirth );

    }

}

这是我的输出:

- Enter your Name : Ali HISOKA
- Enter your IC number : 123456
- Enter your Place of birth : - Enter your Age : 

我尝试了很多来解决这个问题。我能想到的唯一解决方案是使用 input.next(); 而不是 input.nextLine(); 。然而,这个解决方案对我来说是无用的,因为你们知道,当使用 input.next(); 时我们只能输入一个单词,不像 input.nextLine(); 我们可以输入很多单词,这就是我的意思寻找。我也不想重新排序(重新排列)我的输入并首先输入字符串数据,然后输入 Int 数据来解决我的问题。我希望我的数据与您在我的简单程序中看到的相同类型(输入姓名、输入身份证号码、输入出生地,然后输入年龄)。那我能解决这个问题吗?

我在互联网上搜索了很多,想找到和我一样有问题的人,但我找不到问题和解决方案,因为我的问题看起来和我的一模一样。

我已经知道我的问题的原因和解释

Joshua

"The reason for the error is that the nextInt only pulls the integer, not the newline. If you add a in.nextLine() before your for loop, it will eat the empty new line and allow you to enter 3 names."

但还是没有解决我的问题

这有点令人困惑,因为您发布的代码并没有显示您原来的问题,而是显示了解决方法后的情况。

您需要跳过 nextInt()

之后的换行符
    System.out.print("- Enter your IC number : ");
    int icNumber = input.nextInt();
    input.skip("\n");

如果没有跳过,input.newLine(出生地)将匹配输入身份证号码后的换行符,并提示您输入年龄。

我在我的机器上尝试了你的代码,没有做任何更改,它的工作 fine.Below 是我的输出。

  • 输入您的姓名:yash
  • 输入您的身份证号码:12
  • 输入您的出生地:alg
  • 输入您的年龄:25 曾经有一个很棒的人叫亚什,他的身份证号码是12 . He/She今年25岁。 She/He 出生于 alg

据我所见,readLine() 似乎只是在使用从缓冲区中取出 int 后留下的换行符。解决此问题的更好方法是使用 nextLine() 获取字符串值并将其转换:

int icNumber = Integer.parseInt(input.nextLine());

将您的输入视为单个字符串:

"Ali HISOKA\n123456\nPLACE\n99"

  • next() 消耗第一个单词,直到第一个白色 space - 例如" ""\n"
  • nextLine() 消耗第一个单词,直到第一个换行符
  • nextInt() 消耗第一个单词,如 next(),并将其解析为 int - 如果无法解析单词,它将抛出异常。

现在,让我们看看您的通话消耗了什么:

  1. nextLine()将return"Ali HISOKA",剩下的字符串就是"123456\nPLACE\n99"
  2. nextInt() 将return int 123456,剩下的字符串就是"\nPLACE\n99"
  3. nextLine()将return空串"",剩下的串就是"PLACE\n99"
  4. nextInt() 将抛出异常,因为它会尝试将 "PLACE" 解析为 int.

诀窍在第 2 步 - 尽管 nextInt() 消耗了单词之间的所有白色 space,但是它不消耗换行符,因此第 3 步中的 nextLine() 读取为空字符串,因为 "\n" 是剩余字符串中的第一个字符。

有两种解决方法:

  1. 您可以阅读并解析整行 Integer.parseInt(input.nextLine()) 而不是使用 nextInt()。如果该行包含几个词,例如"1234 abc" 会抛出异常。
  2. 在调用 nextInt() 之后调用 input.nextLine(),因此它会消耗剩余的字符串直到第一个换行符。对于输入 "1234 abc" 它将忽略数字后的所有内容。

我会推荐第一个解决方案,因为当您被要求输入号码并回答“123 abc”时,这不是有效答案。在这种情况下,应该告知用户输入无效,而不是只从该答案中提取有效部分——用户不会知道他的部分答案被忽略了。