无法扫描字符串或整数

时间:2017-11-29 20:31:30

标签: java

所以我试图计算一个Simple程序,该程序有n个Person类型的对象,每个人都有一个名字,id,护照和驾照。

它是这样的:

public class Person {

    private String name;
    private int id;
    private int passport;
    private int licence;

    Person(String name, int id, int passport, int licence) {
        this.name=name;
        this.id=id;
        this.passport=passport;
        this.licence=licence;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner jin=new Scanner(System.in);
        int n=jin.nextInt(), i;
        Person[] dudes=new Person[n];
        for(i=0; i<n; i++) {
            String name=jin.nextLine();
            int id=jin.nextInt();
            int passport=jin.nextInt();
            int licence=jin.nextInt();
            dudes[i]=new Person(name, id, passport, licence);
        }
    }
}

但是,当我输入String名称的值时,它会给我这个错误:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at test.Main.main(Main.java:20)

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

已经讨论了同样的问题here。所以,你得到这种例外的原因如下:

  1. int n = scanner.nextInt(), i;您输入一个号码,然后按EnternextInt()仅使用数字,而不是行尾
  2. 当您输入一个数字并按下Enter以下行时:String name=jin.nextLine();会自动执行。
  3. 您期望String类型,但已经是这一行:int id=jin.nextInt();
  4. 这就是你获得exception的原因。如果您循环一次并输入例如以下内容,则可以不加修改地避免它:

    1. 1 test
    2. 1
    3. 2
    4. 3
    5. 但最好以nextLline()读取,并将整数解析为Integer.parseInt(nextLine)

答案 1 :(得分:1)

可能不是正确的方法,但尝试使用默认构造函数并将for循环设为

for(i=0; i<n; i++)
{
    dudes[i]=new Person();
    dudes[i].name = jin.nextLine();
    dudes[i].id = jin.nextInt();
    dudes[i].license = jin.nextInt();
    dudes[i].passport= jin.nextInt();   
}

答案 2 :(得分:1)

如果您将String name = jin.nextLine();更改为String name = jin.next();,那么它的工作方式就会如此。

更简单的方法是在键入int之后清除缓冲区,就像输入名字和姓氏一样。

for(i=0; i<n; i++)
    {
        jin.nextLine();  // add this to clear the input from before.
        String name=jin.nextLine();
        int id=jin.nextInt();
        int passport=jin.nextInt();
        int licence=jin.nextInt();

        dudes[i]=new Person(name, id, passport, licence);
    }

答案 3 :(得分:1)

本段代码中的问题:

int n=jin.nextInt(), i;
        Person[] dudes=new Person[n];
        for(i=0; i<n; i++) {
            String name=jin.nextLine();
            int id=jin.nextInt();
            int passport=jin.nextInt();
            int licence=jin.nextInt();
            dudes[i]=new Person(name, id, passport, licence);
        }

实际上当你读取输入n=jin.nextInt()时,读取输入数据的扫描器的光标仍然在同一行,所以当编译器转到此行String name=jin.nextLine()执行它时,它将只读取字符串at在同一行中,在您阅读n后按 Enter ,然后输入name字符串,这样您将读取整数变量id而不是字符串变量{ {1}}并且编译器将抛出错误消息name

要了解问题,请尝试以下情况:

java.util.InputMismatchException

enter image description here

在这种情况下,扫描程序将在同一行输入int n=jin.nextInt(); String name=jin.nextLine(); int id=jin.nextInt(); int passport=jin.nextInt(); int licence=jin.nextInt(); System.out.println(name + " " + name.length()); 整数后读取name字符串。

enter image description here

但是在这种情况下,扫描程序在输入n整数后不会读取name字符串,因为您点击 Enter 并转到下一行,因此name变量将为空字符串。

要解决此问题,您只需要输入:n

答案 4 :(得分:0)

为什么不尝试这样的事情,或者你必须使用简单的array?同时将settergetter方法添加到Person课程中。如果您扩展您的程序,您可以遍历您的ArrayList并打印出其中的所有人员。

    Scanner jin = new Scanner(System.in);
    List<Person> dudes = new ArrayList<>();

    System.out.print("How many persons do you wan't to add?");
    int n = jin.nextInt();

    for (int i = 0; i < n; i++) {

        jin.nextLine();
        System.out.print("Enter your name: ");
        String name = jin.nextLine();
        System.out.print("Enter your id: ");
        int id = jin.nextInt();
        System.out.print("Enter your passport:");
        int passport = jin.nextInt();
        System.out.println("enter your licence:");
        int licence = jin.nextInt();
        Person newPerson = new Person(name, id, passport, licence);
        dudes.add(newPerson);

        System.out.println("new person added: " + newPerson.getName() + " Id: " + newPerson.getId() + " passport: "
                + newPerson.getPassport() + " licence: " + newPerson.getLicence());
    }

    //prints your ArrayList
    for (Person person : dudes) {
        System.out.println("name: " + person.getName() + " Id: " + person.getId() + " passport: "
                + person.getPassport() + " licence: " + person.getLicence());
    }