2017-09-18 18 views
0

私のプログラムにはエラーはありませんが、間違った学生が私のコース(アレイ)から削除されています。 3番目の生徒(James)に名前を変更すると、dropStudent行にNPEエラーが表示されます。私はそれが私のdropStudentメソッドと何か関係があるかもしれないと思うが、私はそれが 'i'と等しいインデックスでコースを通過する必要があり、そのインデックスが名前と等しいとき、それは他の2人の学生を残してnullになる。アレイから間違ったオブジェクトが削除されています

下記のコードを出力します。

package reviseCourse; 
import java.util.*; 

public class ReviseCourse { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     // Create new course to enroll students in 
     ReviseCourse cs216 = new ReviseCourse("cs216"); 

     // Add 3 students to the course 
     cs216.addStudent("William"); 
     cs216.addStudent("Angela"); 
     cs216.addStudent("James"); 

     // Drop the student William from the course 
     cs216.dropStudent("William"); 

     // Print course name and students individually by looping through the numberOfStudents 
     System.out.println("The students in the course " + cs216.getCourseName() + " are:"); 
     for (int i = 0; i < cs216.getNumberOfStudents(); i++) { 
      System.out.print(students[i] + " "); 
     } 

    } 

    private String courseName; 
    private static String[] students = new String[100]; 
    private String[] course = new String[students.length + 1]; 
    private int numberOfStudents; 

    public void populateCourse() { 
     for (int i = 0; i < students.length; i++) { 
      course[i] = students[i]; 
      System.out.println(course[i]); 
     } 
    } 

    public ReviseCourse(String courseName) { 
     this.courseName = courseName; 
    } 

    public void addStudent(String student) { 
     for (int i = 0; i < students.length; i++) { 
      course[i] = students[i]; 
     } 
     students[numberOfStudents] = student; 
     numberOfStudents++; 
    } 

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

    public int getNumberOfStudents() { 
     return numberOfStudents; 
    } 

    public String getCourseName() { 
     return courseName; 
    } 

    public void dropStudent(String student) { 
     for (int i = 0; i < course.length; i++) { 
      if (course[i].equals("William")) { 
       course[i] = null; 
       numberOfStudents--; 
       break; 
      } 
     }  
    } 

    // Deletes all students from the course 
    public void clear() { 
     numberOfStudents = 0; 
    } 

} 

出力:あなたのdropStudent方法で

The students in the course cs216 are: 
William Angela 

答えて

1

dropStudentは、courseアレイを変更しますが、印刷するアレイはstudentではありません。大きな問題は、削除する学生にnullを割り当てているだけですが、生徒の数を減らすことです。したがって、coursesから印刷しても正しい出力は得られません。

学生の配列の場合:

William | Angela | James : numStudents = 3 

その後、ウィリアムをドロップすると、配列を作る:

null | Angela | James : numStudents = 2 

あなたが学生を印刷しようとした場合、あなたのコードは、最初の2つの要素が出力されますされますnullとアンジェラです。おそらくあなたが望むものではないでしょう。ただArrayListを使用ウィリアムを落とし、またはその代わりに車輪の再発明後

Angela | James | null : numStudents = 2 

:あなたが学生をドロップすると、配列ではなく、次のようになりますように

あなたは、要素の上にシフトしなければならないのいずれか。

1

if (course[i].equals("William")) { 

したがって、この方法は今までのウィリアム、学生が実際に渡されるに関係なくドロップする予定です。

さらに、studentsアレイをループしていますが、dropStudentは、courseアレイの学生のみを削除します。

+0

出力ではまだ彼はまだそこにいるのがわかりますが、ジェームスは残っています。 – Devin

+0

ジェームズはまだ「スチューデント」の配列にいます。あなたは 'numberOfStudents'までループしているだけなので、ループで彼を見ることはできません。 –

1
public void dropStudent(String student) { 
    for (int i = 0; i < course.length; i++) { 
     if (course[i].equals(student) { 
      course[i] = null; 
      numberOfStudents--; 
      //can re order to keep the array tidy, ie go with for if you find a 
      //null then set it to be the next value in the array; thus will keep 
      //array management more efficient 
      break; 
     } 
    }  
} 
関連する問題