0

このために、オブジェクト指向の Java を実行する BlueJ を実行しており、JVM 7.1 をアクティブにしています。

わかりましたので、学位の申請をしなければなりませんが、問題が発生しています。イテレータが私の単一配列システムを台無しにして以来、「先生」が私の三重配列システムを使用させてくれたことに感謝しています。

残念ながら、私の問題を解決するためにインターネット上で何かを見つけることができませんでした...

基本的に、「学生」を配列に追加しようとすると、オブジェクトはすべてのフィールドで null になります。そして、それらを変更する方法がわかりません。

私の配列はひし形表記を使用しています。次のようにします。

private ArrayList<Student> students;

これは私が現在使用している配列の形式であり、さらに2つの配列があります。

private ArrayList<CollegeEmployee> staff;
private ArrayList<Faculty> members;

私は単一の配列を使用するようにアドバイスされましたが、言われたように、イテレータがそれを台無しにしてしまい、それを修正できる限り、配列がいくつあるか気にしません笑。

プログラムは while ループ内で実行され、ユーザーに特定のコマンドの文字を入力するように求めます。ユーザーが「s」と入力すると、学生が配列に追加され、ここで問題が発生します。オブジェクトにはnull値が与えられ、それらを変更する方法がわかりません...以下は、オブジェクトコンストラクター

private void addStudent()
{
    Student b = new Student(firstName, lastName, address, postCode, phoneNumber, gradePointAvg, selectedCourse);
students.add(b);
}

ユーザーがプログラムを終了したときに配列が出力されると、ターミナル ウィンドウから次の入力が得られます。

ヌル、ヌル、ヌル、0、0 0 ヌル

私の質問は、オブジェクト b の値を指定して null の値をオーバーライドするにはどうすればよいかということです。ところで、値はユーザーが入力する必要があり、配列の宣言で事前に設定する必要はありません。

お時間をいただきありがとうございます:)

これは私がコードを嫌いにさせます xD

編集:

学生クラスのコンストラクタとフィールドは次のとおりです。

    private String title;
        public double gradePointAvg;
        public String selectedCourse;

        /**
         * Constructor for objects of class Student
         */
        public Student(String firstName, String lastName, String address, int postCode, int phoneNumber, double gradePointAvg, String selectedCourse)
        {
            super(firstName, lastName, address, postCode, phoneNumber);
            this.title = title;
            this.gradePointAvg = gradePointAvg;
            this.selectedCourse = selectedCourse;
        }

Person スーパークラス コンストラクター:

public String firstName;
public String lastName;
public String address;
public int postCode;
public int phoneNumber;

 /**
 * Constructor for objects of class Person
 */
public Person(String firstName, String lastName, String address, int postCode, int phoneNumber)
{
    // initialise fields
    this.firstName = firstName;
    this.lastName = lastName;
    this.address = address;
    this.postCode = postCode;
    this.phoneNumber = phoneNumber;
}

上記の addStudent メソッドは、student コンストラクターを呼び出し、次に person コンストラクターを呼び出します。はい、プロジェクトの制限として、このようにする必要があります。

そして、プライベートはローカルスコープであるため、フィールドが保護されているため、フィールドを今のところ公開しました。

私のコードをチェックしてくれてありがとう..私の先生がもっと良かったらいいのに >.<

4

3 に答える 3

0

ArrayList を初期化しましたか??

 private ArrayList<Student> students;
 students = new ArrayList<Student>();

そうしないと

private ArrayList<Student> students = new ArrayList<Student>();

初期化されていない場合、null 値が返され、null ポインター例外が発生します。

于 2012-05-23T04:11:13.483 に答える
0

あなたの Student クラスfirstName, lastName, address,selectedCourseにはおそらくStringあり、Javaはオブジェクト(あなたの場合は文字列)であるインスタンス変数を に初期化nullします。他のフィールド、つまりデフォルト値は0postCode, phoneNumberだと思います。int

addStudentオブジェクトを構築するために使用している値をメソッドでチェックしているとき、すべての文字列が null であり、int が初期化されていないようです。

Student b = new Student(firstName, lastName, address, postCode, phoneNumber, gradePointAvg, selectedCourse);

上記のコードが実行されると、firstName、lastName などのパラメータには値がないと思います。そのため、null が表示されます。

リストに新しいStudentオブジェクトを追加する前にstudents、ユーザーにfirstName, lastName, addressetc の値を指定するように求め、それらの値を使用してStudentオブジェクトを作成します。

サンプル コードの更新:

学生クラス:

package com.mumz.test.scanner;

public class Student {
    private String firstName = null;
    private String lastName = null;
    /**
     * @param firstName
     * @param lastName
     */
    public Student(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }
    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }
    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return String.format("Student [firstName=%s, lastName=%s]", firstName, lastName);
    }
}

メインクラス

package com.mumz.test.scanner;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class StudentScannerApp {
    private List<Student> students = new ArrayList<Student>();
    public static void main(String[] args) {

        StudentScannerApp studentScannerApp = new StudentScannerApp();
        //This scanner we will use for reading data from input stream
        Scanner inputStream = new Scanner(System.in);

        System.out.println("Enter First Name");
        String firstName = inputStream.nextLine();
        System.out.println("Enter Last Name");
        String lastName = inputStream.nextLine();
        studentScannerApp.addStudent(firstName, lastName);

        System.out.println("Enter Another student details");
        System.out.println("Enter First Name");
        firstName = inputStream.nextLine();
        System.out.println("Enter Last Name");
        lastName = inputStream.nextLine();
        studentScannerApp.addStudent(firstName, lastName);

        System.out.println(studentScannerApp.students);
    }

    private void addStudent(String firstName, String lastName){
        Student student = new Student(firstName, lastName);
        students.add(student);
    }
}
于 2012-05-23T04:12:53.700 に答える