从文本文件读取并存储到数组中(JAVA)

从文本文件读取并存储到数组中(JAVA),java,Java,第一行是文本文件中的学生人数,所有其他行是学生人数+他们在班上的成绩。我正在尝试将它们导入数组类列表[]。我对java和面向对象的东西非常陌生,所以如果我的代码是垃圾代码,我很抱歉。我省略了enlargeList方法,因为它可以工作,我已经对它进行了测试 谢谢 将读取V0012345 98,然后 String studentId = scanner.nextLine(); 将读取V0023456 33并失败 尝试: 我至少可以看到四个问题 首先,intnumberofstudents=scan

第一行是文本文件中的学生人数,所有其他行是学生人数+他们在班上的成绩。我正在尝试将它们导入数组类列表[]。我对java和面向对象的东西非常陌生,所以如果我的代码是垃圾代码,我很抱歉。我省略了enlargeList方法,因为它可以工作,我已经对它进行了测试

谢谢

将读取
V0012345 98
,然后

String studentId = scanner.nextLine();
将读取
V0023456 33
并失败

尝试:


我至少可以看到四个问题

首先,
intnumberofstudents=scanner.nextInt()
不会使用新行字符,这意味着您下次尝试从扫描仪读取内容时,可能会获得新行字符(如果您正在读取文本)或读取数值的异常

尝试在它之后添加
scanner.nextLine()
,例如

String line = scanner.nextLine();

//this will ignore empty lines
if(line.equals("")) continue;

String[] lineArray = line.split(" ");
String studentId = lineArray[0];
int mark = Integer.parseInt(lineArray[1]);
在知道可能的行数之前,您正在预初始化阵列。我觉得这很奇怪。你提前知道你需要读多少行,为什么不使用它呢

int numberOfStudents = scanner.nextInt();
scanner.nextLine();
接下来,当读取学生数据时,您似乎正在读取整行数据,在它之后查找
int

这意味着您正在使用
scanner.nextLine()
读取
V0012345 98
,但是下一次调用
scanner.nextInt()
将遇到
V0023456
,该值不是有效的
int

相反,阅读下一行并创建一个新的
扫描器来解析它

int numberOfStudents = scanner.nextInt();
scanner.nextLine();
Student[] classList = new Student[numberOfStudents];
这只是一种可能的方法,但我想坚持使用
扫描仪
只是因为您似乎对它很满意

现在,在复合循环中的某个地方,有些东西搞砸了,
扫描仪
正在失去同步

现在,因为我们已经将数组初始化为我们首先读取的头信息,所以我们可以删除复合循环,以支持以下内容

Scanner scanLine = new Scanner(line);
String studentId = scanLine.next();
int mark = scanLine.nextInt();
while(scanner.hasNextLine()&&classList.length
相反。我保留了数组长度检查,以防文件丢失。这意味着头可以报告它想要的任何值,但是循环将检查文件中数据的可用性,并且我们有足够的空间来读取它


这一切都假设您试图读取的文件中没有空行,这与您发布的示例不同。如果有,您需要添加签入并跳过这些行

请发布错误。这是编译器错误消息吗?异常堆栈跟踪?输出错误?您的问题是什么?我们需要在这里编写一个名为grow array的函数,因为我们还将通过命令行添加学生(但不将该信息保存到文本文件)。所以我们真的不知道数组是什么。专注于初始部分,读取文件。一旦您拥有了该文件,就可以在以后扩展阵列。您可以将
while循环
更改为仅检查
scanner.hasNextLine()
,并确定是否需要在将下一个
学生
添加到数组之前增加该数组。。。
int numberOfStudents = scanner.nextInt();
scanner.nextLine();
int numberOfStudents = scanner.nextInt();
scanner.nextLine();
Student[] classList = new Student[numberOfStudents];
Scanner scanLine = new Scanner(line);
String studentId = scanLine.next();
int mark = scanLine.nextInt();
while (scanner.hasNextLine() && classList.length < i) {
    String line = scanner.nextLine();
    Scanner scanLine = new Scanner(line);
    String studentId = scanLine.next();
    int mark = scanLine.nextInt();
    scanLine.close();
    classList[i] = new Student(studentId, mark);
    i++;
}