当前位置: 首页 > 知识库问答 >
问题:

构建不使用Java中的ArrayList将包含多个变量的文本文件读入数组的方法

东方骏
2023-03-14
public class Main2{
public static void main(String[] args) throws FileNotFoundException {
    String filename = "students.txt";
    Student[] record = readData(filename);
    record = new Student [record.length];

    for(int i = 0; i < record.length; i++){

        System.out.println(record[i]);

    }
}

//Method for read data from the .txt file into an array
private static Student[] readData(String filename){

    int arraysize = 0;
    try{
        Scanner s1 = new Scanner(new File(filename));

       //Count elements in the file
       while(s1.hasNext()){
           arraysize++;
           s1.next();
       }

       //Create an array and copy the elements into it
        Student[] studentRecord = new Student[arraysize];
        Scanner s2 = new Scanner(new File(filename));

        for(int i = 0; i < arraysize; i++){
            studentRecord[i].name = s2.next();
            studentRecord[i].physic = s2.nextInt();
            studentRecord[i].chemistry = s2.nextInt();
            studentRecord[i].math = s2.nextInt();
            studentRecord[i].average = (double)(studentRecord[i].physic + studentRecord[i].chemistry + studentRecord[i].math)/3;
            // double roundedAvg = Math.round(average * 100.0) / 100.0;
            // studentRecord[i].average = Math.round((physic + chemistry + math)/3 * 100.0)/100.0;

        }
        return studentRecord;
    }

    catch(FileNotFoundException e){

    }
    return null;
}
Jack  77      84       93
Tod   84      86       80
Name marksP marksC   marksM
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "name" because "<local3>[<local5>]" is null
    at Main2.readData(Main2.java:40)
    at Main2.main(Main2.java:10)
public Student(String name, int m1, int m2, int m3, double avg){
       this.name = name;
       int.mark1 = m1;
        ...
 }

我做错了什么?如何修复代码?当我在Student类中初始化时,名称不应为null。

共有1个答案

董谦
2023-03-14

在从文件中读取数据的for循环中,StudentRecord还不包含实际的Student对象。到目前为止,它只是一个占位符,可以容纳指定数量的student对象。因此,您需要实际创建student对象来存储在指定的数组中。

为此,请读取数据,将其暂时存储在变量中,然后通过已有的构造函数创建每个student对象。

所以它实际上应该是这样的:

for(int i = 0; i < arraysize; i++){
    String name = s2.next();
    int physic = s2.nextInt();
    int chemistry = s2.nextInt();
    int math = s2.nextInt();
    double average = (double)(physic + chemistry + math) / 3;
    Student myStudent = new Student (name, physic, chemistry, math, average);
    studentRecord[i] = myStudent;
}
while(s1.hasNextLine()){
    arraysize++;
    s1.nextLine();
}
 类似资料:
  • 问题内容: 我有多个包含不同类型的txt文件的zip文件。如下所示: 如何使用pandas读取每个文件而不提取它们? 我知道每个zip文件是否为1个文件,我可以对read_csv使用压缩方法,如下所示: 任何有关如何执行此操作的帮助都将非常有用。 问题答案: 你可以传递到构建从包装成一个多文件一个CSV文件。 码: 将所有内容读入字典的示例:

  • 问题内容: 我正在尝试使用文件“ Tall.txt”将其中包含的整数写入名为“ tall”的数组中。它在某种程度上做到了这一点,但是当我运行它时,它会引发以下异常(: 为什么要完全做到这一点,以及如何将其删除?如我所见,我将文件读取为字符串,然后将其转换为int,这是非法的。 问题答案: 您可能想做这样的事情(如果您使用的是Java 5及更高版本)

  • 问题内容: 你如何将文件内容读入Java? 以下是文件内容: 只需将每个单词读入。 问题答案: 此Java代码读取每个单词并将其放入ArrayList中: 如果要逐行而不是逐字阅读,请使用和。

  • 这些文件的内容是: 学生(字符串名称,int studentID,int grade1,int grade2,int grade3,int grade4,int grade5,int grade6,int grade7,int grade8,int grade9,int grade10) 我对如何将学生的名字输入到数组中感到困惑,因为它包含了一个空格,所以当我尝试使用。next()时,它只得到学生

  • 问题内容: 我想读取一个包含多行的名为history.txt的文本文件,并将最后一行的内容存储到一个名为“ tag”的变量中。 谢谢 问题答案:

  • } PS,arrayList中的内容插入到程序中的某个点,因此arrayList不是空的。