配列の重複チェック


登録した人の重複をチェックし、平均年齢を求めるプログラムを作り、現状以下のようになっています。平均年齢は求められるのですが、重複のチェックができていないようです。

[code]

    public class Main {
        
        public void main(String[] args) { 
            StudentInfo student = new StudentInfo(); 
            student.addStudents(new Student("Taro Sato","111",21)); 
            student.addStudents(new Student("Taro Sato","111",21)); 
            student.addStudents(new Student("Akari Kato","112",20)); 
            student.addStudents(new Student("Taizo Hayashi","113",23)); 
            student.addStudents(new Student("Hikari Watanabe","114",22)); 
                    
            double average = StudentInfo.getAverage(); 
            System.out.println("平均年齢:"+ average); 
            
        }
    }
    
    public class Student {
    
        String name ="";  //名前    
        String studentID ="";  //学生ID    
        int age ;   //年齢 
        public Object id;
    
        public Student(String name, String id, int age) {        
            this.name = name;        
            this.studentID = id;        
            this.age = age;
        }
        
        public String getName(){
            return name;
        }
        public String getId(){
            return studentID;
        }
        public int getage(){
            return age;
        }
    }
    
    public class StudentInfo {
        
        public static final int MAX_COUNT=100; //取り扱えるStudentの最大数;
        static Student[] students = new Student[ MAX_COUNT]; //管理するStudent
        static int studentCount =0;  //配列に格納されたStudentの数
    
        public String id ="";//初期化
        public String name ="";
        public int age =0 ;
    
        //・引数 ：student ／Student 追加する Student
        //・戻り値：追加できた時は true, 失敗したときはfalse を返す．
        //・目的 ：StudentInfo 内の配列に Student を追加する．引数の値が null である場合，
        //         配列で扱 える最大数を超えた場合や，既に同じ情報を持つ Student が登録されている場合は，
        //         登録されずにfalse を返す．
    
        public boolean addStudents(Student student){
            //引数にStudent以外のクラスが指定 された時はfalseを返す
            if(student instanceof Student != true )
                    return false;
            //配列で扱える最大数を超えた場合
            if(studentCount > MAX_COUNT || student == null){
                    return false;
                }
            //配列の要素を一つ一つ同じである かどうかを確認し，全て同じであれ ばtrueを返す
                Student target = (Student)student;
                //for文で重複チェック
                for(int i=0; i<=studentCount; i++){
                
                if(this.name.equals(target.name) && (this.id.equals(target.id)) && this.age == target.age)
                    return false;
                }
                    students[studentCount] = student;////student[studentCount]にstudentを代入
                    studentCount++;
                    System.out.println(studentCount); 
                
                    return true;                
                }
        
        //・引数 ：なし
        //・戻り値：配列に登録されている Studentの平均値
        //・目的 ：StudentInfo の配列に登録されている Student の平均年齢を算出して返す．
        //         登録され ている Student がない場合は0 を返す．
    
        public static double getAverage(){
            double average = 0.0;
                for(int i=0; i < studentCount; i++)
                    average += (double)students[i].getage();
                    System.out.println(average/studentCount); 
                return average/studentCount;
        }
    
[/code]




`Student.id`変数が初期化されていないので、`null`のままと思います。  
そのため、

[code]

    this.id.equals(...)
    
[/code]

メソッドの呼び出しで`NullPointerException`になっているように見受けます。

`id`メンバを適切に初期化すると事象解消すると思います。(※どういう値にしたいのかは、コード例からは予想できませんでした)

* * *

なお、文字列の比較は`==`演算子ではなく`equals`メソッドで行って正しいです。

