所以我试图计算一个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)
有什么想法吗?
答案 0 :(得分:2)
已经讨论了同样的问题here。所以,你得到这种例外的原因如下:
int n = scanner.nextInt(), i;
您输入一个号码,然后按Enter
。 nextInt()
仅使用数字,而不是行尾。 Enter
以下行时:String name=jin.nextLine();
会自动执行。String
类型,但已经是这一行:int id=jin.nextInt();
这就是你获得exception
的原因。如果您循环一次并输入例如以下内容,则可以不加修改地避免它:
但最好以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
在这种情况下,扫描程序将在同一行输入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
字符串。
但是在这种情况下,扫描程序在输入n
整数后不会读取name
字符串,因为您点击 Enter 并转到下一行,因此name变量将为空字符串。
要解决此问题,您只需要输入:n
答案 4 :(得分:0)
为什么不尝试这样的事情,或者你必须使用简单的array
?同时将setter
和getter
方法添加到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());
}