Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将文本文件中的数据输入动态数组对象时出现NullPointerException_Java_Arrays_Object_Nullpointerexception - Fatal编程技术网

Java 将文本文件中的数据输入动态数组对象时出现NullPointerException

Java 将文本文件中的数据输入动态数组对象时出现NullPointerException,java,arrays,object,nullpointerexception,Java,Arrays,Object,Nullpointerexception,我正在制作一个投票系统,用户用自己的学生号登录并进行选择。一旦有人投票,他们就无法再次登录。我做了一个物体;学生,包含学生编号的字符串和该学生编号是否已投票的布尔值(两者都是私有的)。我制作了一个这种类型的动态数组,以接受通过扫描仪读取的文本文件中给定数量的学生。但是,当我尝试在对象数组中填充student number字符串时,会得到一个NullPointerException。扫描仪正在从文本文件中读取信息,但当我尝试将信息放入Student对象的私有字符串时,会发生错误。当我使用字符串数组

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

读取文本文件并填充数组的方法(全局声明和构造学生,初始大小为0):

学生对象:

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) 

提前谢谢

您分配的元素仍然为
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());
我只想指出,数组复制过程并不快,每次只分配一个新元素可能不是特别有效的方法


如果不能使用
列表
实现之类的东西,那么最好在每次需要更多空间时分配额外的空间(因此5-10个新元素),这将有助于减少分配数量并提高效率。

创建一个类似
新字符串[10]
的数组,然后迭代并打印出每个元素。它们有什么价值?正如我所说,我是编程新手,你所说的“迭代并打印出每个元素”是什么意思?或者,使用初始化的
列表,而不是数组。而且,由于您想禁止学生投票两次,请使用
Map
。@user2920781数组有X个元素。使用索引从0开始一直到数组长度(独占)的for循环,访问数组中的每个元素并将其打印出来。@Sotirios Delimanolis Nothing打印出来。。。错误发生在我尝试向数组添加值时,数组是空的,这就是问题所在,我无法填充它。谢谢!!!不太清楚这是如何工作的,但我的程序现在工作得很好:基本上,可以将数组看作是一系列桶。你所做的是说“我需要10桶”,这很好。但是您没有在这些存储桶中放入任何内容,因此当您从存储桶中获取值时,那里没有任何内容
students[a]
was
null
。所以我们先把东西放进桶里,然后再尝试接近它。如果有帮助,请查看了解更多详细信息;)
students[a] = new Student();
students[a].setStudentNumber(fileReader.nextLine());