为什么我的代码中有 InputMismatchException

Why there is an InputMismatchException in my code

     System.out.print("Input the number of persons: ");
     Scanner scanner = new Scanner(System.in);
     int noOfP = scanner.nextInt();

     Person[] person = new Person[noOfP];

     String name;
     int age;
     for(int i = 0; i < person.length; i++){
        System.out.println("Input name for guest: ");
        name = scanner.nextLine();
        System.out.println("Input age for guest: ");
        age = scanner.nextInt();

        person[i] = new Person(name,age);
     }

我只想初始化 Person 数组并设置姓名和年龄,但它在第 age = scanner.nextInt();

行抛出一个 InputMismatchException

当您在 scanner.nextInt() 后按回车键时,永远不会删除结尾的换行符。出于这个原因,我一直发现使用 Integer.parseInt(scanner.nextLine()) 而不是 scanner.nextInt() 最容易;这些问题永远不会发生。

当您询问人数时,用户不仅仅是在输入一个数字,他们还在输入流中插入一个行终止符。因此,当您询问名称时,您并没有得到名称,而是在名称之前得到了行终止符。然后当你为年龄做 .nextInt() 时,你终于得到了名字。因此,您需要做的第一件事是在读取 noOfP 的值后添加 scanner.nextLine() 以跳过该行终止符。这将解决第一人称时代的问题。然后事情又会开始崩溃。

当你询问年龄时你做同样的事情:你调用 scanner.nextInt(),在流中留下另一个行终止符。在那之后你需要另一个 scanner.nextLine() 这样事情就不会在第二个人身上爆发。

代码将如下所示:

System.out.print("Input the number of persons: ");
Scanner scanner = new Scanner(System.in);
int noOfP = scanner.nextInt();
scanner.nextLine();

Person[] person = new Person[noOfP];

String name;
int age;
for(int i = 0; i < person.length; i++){
    System.out.println("Input name for guest: ");
    name = scanner.nextLine();
    System.out.println("Input age for guest: ");
    age = scanner.nextInt();
    scanner.nextLine();

    person[i] = new Person(name,age);
}