0

我正在处理我的第一个 Java 编程任务,我还有另一个问题。我在 Student[] 中放了一个 Course[] 但现在似乎遇到了 NullPointerException 错误,我不知道为什么。

public Student[] analyzeData() {
    Scanner inputStream = null;

    try {
        inputStream = new Scanner(new FileInputStream("Programming Assignment 1 Data.txt"));
    } catch (FileNotFoundException e) {
        System.out.println("File Programming Assignment 1 Data.txt could not be found or opened.");
        System.exit(0);
    }

    int numberOfStudents = inputStream.nextInt();
    int tuitionPerHour = inputStream.nextInt();

    Student[] students = new Student[numberOfStudents];
    for (int i = 0; i < numberOfStudents; i++) {
        String firstName = inputStream.next();
        String lastName = inputStream.next();
        int studentID = inputStream.nextInt();
        String isTuitionPaid = inputStream.next();
        int numberOfCourses = inputStream.nextInt();


        Course[] courses = new Course[numberOfCourses];
        for (i = 0; i < numberOfCourses; i++) {
            String courseName = inputStream.next();
            String courseNumber = inputStream.next();
            int creditHours = inputStream.nextInt();
            String grade = inputStream.next();
            Course currentCourse = new Course(courseName, courseNumber, creditHours, grade);
            courses[i] = currentCourse;
        }
        Student currentStudent = new Student(firstName, lastName, studentID, isTuitionPaid, numberOfCourses, courses);
        students[i] = currentStudent;
    }
    return students;
}

输入文件的格式为:

3 345
Lisa Miller 890238 Y 2 
Mathematics MTH345 4 A
Physics PHY357 3 B


Bill Wilton 798324 N 2
English ENG378 3 B
Philosophy PHL534 3 A

其中课程有关于课程的信息,学生有关于学生的信息。

4

4 回答 4

2

您的文件的自然对象映射将是一个Student对象列表,每个对象都包含一个Course对象列表。该courses数组应存储在学生对象内。

于 2012-06-11T20:31:18.567 回答
2

嗯,我这样做的方法是有一个数据结构来表示内存中的已解析文件。所以基本上它看起来像这样:

public class RegistrationFile{

  private Students[] students;
  private Courses[] courses;

  public void loadFromFile(File f){
  //do your logic to parse the file
  //and store the results in the appropriate data members
  }

  public Students[] getStudents(){
    return students;
  }

  public Courses[] getCourses(){
    return courses;
  }
}

然后,从您的其他代码中,您将创建一个注册文件对象的实例,并loadFromFile()在您尝试访问任何内容之前调用加载数据。

于 2012-06-11T20:31:28.627 回答
1

我会添加一个数组(或者更好的是,ArrayList 或 Map),Student其中包含学生正在学习的课程。

根据您的工作,您如何确定哪些课程与哪些学生一起上课?

尝试添加以下实例变量

  private List<Course> courses;

to Student,然后实现以下方法以添加到 List 或返回整个事物。

  void addCourse(Course c) { /*code here*/ };
  List getCourses() {/* code here */} ;

阅读文件可能会很痛苦,至少目前还可以。您Course实例化的循环将包括一个 call student.addCourse(course)。那你就是金子了。

请注意,这是一个高层次的概述,因此这里可能会为您提供一些学习。只需回帖,我们会提供帮助。

于 2012-06-11T20:38:06.947 回答
0

除了设置正确的对象来代表学生/课程(就像@ChrisThompson 所做的那样),您还希望能够读取学生/课程的任意数量的记录,对吗?

您需要相应地解析文件。例如,当您点击一个空白行时,您知道您正在移动到下一条记录(第一条记录除外)。还可以利用第一行将是学生(或者如果它有 5 个令牌)而后续行是她的课程(或者如果该行有 4 个令牌)这一事实。

该单元应包括对整个输入文件的循环中的一次迭代。创建一个给定的学生对象和他的课程对象循环的一个迭代。

于 2012-06-11T20:36:21.393 回答