0

ユーザーが学生番号でログインして選択する投票システムを作成しています。誰かが投票すると、再度ログインすることはできません。オブジェクトを作成しました。学生番号の文字列と、その学生番号がすでに投票したかどうかのブール値を含む学生 (両方とも非公開)。このタイプの動的配列を作成して、スキャナーを使用して読み取られるテキスト ファイルから特定の数の学生を受け入れるようにしました。ただし、オブジェクト配列内に学生番号の文字列を入力しようとすると、NullPointerException が発生します。スキャナはテキスト ファイルから情報を読み取っていますが、その情報を Student オブジェクトのプライベート文字列に入れようとするとエラーが発生します。文字列の配列を使用すると、すべて正常に機能しますが、そうではありません 誰かがすでに投票したかどうかを示すブール値があります。私はプログラミングにまったく慣れていないので、何が問題なのかわかりません。誰かが何が間違っているのか、どのように修正できるのか説明してもらえますか?

テキスト ファイルが読み取られ、配列が設定されるメソッド ( students はグローバルに宣言および構築され、最初はサイズが 0 です):

public static void getStudentNumbers(){

  int a = 0;
  while(fileReader.hasNext()){

    if (a >= students.length) {
      int newSize = 1 + students.length; 
      Student[] newData = new Student[newSize];         
      System.arraycopy(students, 0, newData, 0, students.length);         
      students = newData;       
    }
    students[a].setStudentNumber(fileReader.nextLine()); //Error occurs here
    a++;
 }
}

学生オブジェクト:

public class Student{
  private Boolean hasVoted = false;
  private String studentNumber = "";

  public void setVotedStatus(Boolean voted){
    hasVoted = voted;
  }  

  public void setStudentNumber(String studentNum){
    studentNumber = studentNum; 
  }

  public Boolean getVotedStatus(){
    return hasVoted;
  }    

  public String getStudentNumber(){
    return studentNumber;
  } 
}

エラー:

java.lang.NullPointerException
 at VotingSystem2_0.getStudentNumbers(VotingSystem2_0.java:279)
 at VotingSystem2_0.main(VotingSystem2_0.java:245)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

前もって感謝します!

4

1 に答える 1

2

割り当てた要素は残りますnull

if (a >= students.length) {
  int newSize = 1 + students.length; 
  Student[] newData = new Student[newSize];         
  System.arraycopy(students, 0, newData, 0, students.length);         
  students = newData;       
  // students[a] == null
}

個人的には、配列内の各要素に新しいものを割り当てる必要がありますStudent。これは、使用する前に割り当てることで最も簡単になります。たとえば...

students[a] = new Student();
students[a].setStudentNumber(fileReader.nextLine());

配列のコピー プロセスは高速ではなく、単純に毎回 1 つの新しい要素を割り当てるだけでは特に効率的ではない可能性があることを指摘しておきます。

実装のようなものを使用できない場合はList、より多くのスペースが必要になるたびに余分なスペース (つまり 5 ~ 10 個の新しい要素) を割り当てることをお勧めします。これにより、割り当ての数が減り、効率が向上します。

于 2013-10-28T00:15:09.810 に答える