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



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

我面临的问题是,当我在字符串数据之前输入 Int 数据时,控制台会跳过字符串数据并立即转到下一个 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 数据来解决我的问题。我希望我的数据与您上面在我的简单程序中看到的排序相同(输入姓名,输入IC号,输入出生地,然后输入年龄)。那么我可以解决这个问题吗?

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

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

乔舒亚

"错误的原因是nextInt只拉取整数, 不是换行符。如果你在 for 循环之前添加一个 in.nextLine(),它会 将吃掉空的新行,并允许您输入 3 个名称。

但这仍然无助于解决我的问题。

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

"Ali HISOKAn123456nPLACEn99"

  • next() 消耗第一个单词,直到第一个空格 - 例如 " ""n"
  • nextLine() 使用第一个单词,直到第一个换行符
  • nextInt()使用第一个单词,如next(),并将其解析为 int - 如果无法解析该字,它将引发异常。

现在,让我们看一下您的通话消耗了多少:

  1. nextLine()将返回"Ali HISOKA",则剩余的字符串"123456nPLACEn99"
  2. nextInt()将返回 int 123456,则剩余的字符串"nPLACEn99"
  3. nextLine()将返回空字符串"",则剩余的字符串"PLACEn99"
  4. nextInt()会抛出异常,因为它会尝试将"PLACE"解析为 int。

诀窍在步骤 2 中 - 虽然nextInt()消耗单词之间的所有空格,但它不会消耗换行符,因此步骤 3 中的nextLine()读取空字符串"n"因为是剩余字符串中的第一个字符。

有两种解决方案:

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

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

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

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

这有点令人困惑,因为您发布的代码没有显示您的原始问题,而是显示变通方法后的情况。

您需要在nextInt()后跳过换行

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

如果没有跳过,input.newLine(对于出生地)将匹配输入的 IC 编号后的换行符,系统将提示您输入年龄。

我在我的机器上尝试了您的代码,没有进行任何更改,并且工作正常。下面是我的输出。

  • 输入您的姓名 : 雅什
  • 输入您的身份证号码 : 12
  • 输入您的出生地 : 藻类
  • 输入您的年龄 : 25从前有一个叫亚什的好人,他的身份证号码是12.他/她今年 25 岁。她/他出生在阿尔格

最新更新