0

我正在制作一个投票系统,用户使用他们的学号登录并进行选择。一旦有人投票,他们将无法再次登录。我做了一个物体;学生,包含学生编号的字符串和该学生编号是否已经投票的布尔值(两者都是私有的)。我制作了一个这种类型的动态数组,以便从通过使用扫描仪读取的文本文件中接受给定数量的学生。但是,当我尝试在对象数组中填充学生编号字符串时,我得到了 NullPointerException。扫描仪正在从文本文件中读取信息,但是当我尝试将信息放入 Student 对象的私有字符串时发生错误。当我使用字符串数组时,一切正常,但后来我没有 没有布尔值来判断是否有人已经投票。我对编程很陌生,不知道问题是什么。有人可以解释什么是错的以及如何解决吗?

读取文本文件并填充数组的方法(全局声明和构造学生,初始大小为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());

我只想指出,数组复制过程并不快,每次简单地分配一个新元素可能不是特别有效。

如果你不能使用类似List实现的东西,每次需要更多空间时分配额外的空间(所以 5-10 个新元素)可能会更好,这将有助于减少分配次数并有助于提高效率。

于 2013-10-28T00:15:09.810 回答