扫描文件并将其分配给对象数组时出现“不匹配错误”

时间:2019-05-11 20:33:36

标签: java arrays object

给出一个文件,该文件是学生名册,其中第一行是班级的学生人数,接下来的行中提供了他们的姓名,ID和年龄,例如:

    5
    Mary, 1010, 15
    Ben, 1119, 16
    Sam, 2278, 15
    Alex, 3245, 15
    Mia, 4448, 16

我应该创建一个学生对象数组,但是当我尝试编译代码时会收到“不匹配错误”。

我尝试了以下方法,但是我不确定我的代码有什么问题。

public class Classroom_Runner{
public static void main(String[] args)throws Exception{

File roster = new File("info.txt");
Scanner scanFile = new Scanner(roster);
Scanner scanInput = new Scanner(System.in);
//roster.split(", ");

//String insideFile = "";
int sizeClass = 0;
Classroom[] Students = new Classroom[0];

while(scanFile.hasNext()){
    sizeClass =scanFile.nextInt();
    String name = scanFile.next(); //<-- This would be line 35
    int ID = scanFile.nextInt();
    int age = scanFile.nextInt();

    Classroom student = new Classroom( name, age, ID);

}
    for(int i = 0; i<Students.length;i++){
            System.out.println(Students[i]);}
}
}

实际输出为:

    Exception in thread "main" java.util.InputMismatchException
            at Classroom_Runner.main(Classroom_Runner.java:35)

但预期输出应为:

    Mary, 1010, 15
    Ben, 1119, 16
    Sam, 2278, 15
    Alex, 3245, 15
    Mia, 4448, 16

3 个答案:

答案 0 :(得分:0)

这是因为“ 1010”不是逗号int的{​​{1}},因此以下行不运行:

,

要么删除输入文件中的逗号,要么使用int ID = scanFile.nextInt(); ,用next()删除逗号,然后将其强制转换为substring()

另一个更好的解决方案是在每次迭代时使用int,然后在将需要转换的值转换为scanFile.nextLine()之前,使用String.split(", ")将不同的值放入数组中。

答案 1 :(得分:0)

        sizeClass =scanFile.nextInt();
        String name = scanFile.next(); 

        String temp = scanFile.next();
        temp = temp.substring(0, temp.length() -1);

        int realID = Integer.parseInt(temp);

        //rest of your code

您应该删除尾部的逗号,以便以正确的格式捕获整数。

答案 2 :(得分:0)

您可以使用Files.lines()和Java Streams轻松实现此目标:

Classroom[] students = Files.lines(Paths.get("info.txt")).skip(1)
        .map(line -> line.split(", "))
        .filter(parts -> parts.length == 3)
        .map(parts -> new Classroom(parts[0], Integer.parseInt(parts[1]), Integer.parseInt(parts[2])))
        .toArray(Classroom[]::new);

首先,您阅读了所有行(跳过第一行,则不需要)。然后,您在每一部分中用,分隔每一行。为防止IndexOutOfBoundException,只能处理包含3个部分的行。最后,将每一行映射到Classroom对象,并将所有行收集到一个数组中。

您提供的输入结果将为:

Classroom[name='Mary', age=1010, id=15]
Classroom[name='Ben', age=1119, id=16]
Classroom[name='Sam', age=2278, id=15]
Classroom[name='Alex', age=3245, id=15]
Classroom[name='Mia', age=4448, id=16]