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配列はstudentオブジェクト内に格納する必要があります。

于 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

Student生徒が受講しているクラスを含む配列(または、さらに良いのはArrayListまたはMap)を追加します。

あなたがしていることで、どのクラスがどの生徒と一緒に行くかをどのように決定していますか?

次のインスタンス変数を追加してみてください

  private List<Course> courses;

Student、次に次のメソッドを実装してリストに追加するか、すべてを返します。

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

そして、ファイルを読むことは本当に苦痛かもしれません、少なくとも今のところ、あなたが持っているものは大丈夫です。Courseインスタンス化されるループには、呼び出しが含まれますstudent.addCourse(course)。その後、あなたは金色になります。

これは高レベルの概要であるため、ここで学習できる可能性があることに注意してください。投稿していただければ、サポートさせていただきます。

于 2012-06-11T20:38:06.947 に答える
0

(@ChrisThompsonのように)学生/コースを表す適切なオブジェクトを設定することに加えて、学生/コースのレコードをいくつでも読み取ることができるようにしたいと思いますか?

それに応じてファイルを解析する必要があります。たとえば、空白行をヒットすると、次のレコード(最初のレコードを除く)に移動していることがわかります。また、最初の行が学生(または5つのトークンがある場合)であり、後続の行が彼女のコース(または行に4つのトークンがある場合)であるという事実を利用してください。

このユニットは、入力ファイル全体にわたるループの1回の反復で構成されている必要があります。特定の学生オブジェクトと彼のコースオブジェクトをループの1回の反復で作成します。

于 2012-06-11T20:36:21.393 に答える