Java 从文本文件向动态数组中输入数据时出现NullPointerException
我正在制作一个投票系统,用户用自己的学生号登录并进行选择。一旦有人投票,他们就无法再次登录。我做了一个物体;学生,包含学生编号的字符串和该学生编号是否已投票的布尔值(两者都是私有的)。我制作了一个这种类型的动态数组,以接受通过扫描仪读取的文本文件中给定数量的学生。但是,当我尝试在对象数组中填充student number字符串时,会得到一个NullPointerException。扫描仪正在从文本文件中读取信息,但当我尝试将信息放入Student对象的私有字符串时,会发生错误。当我使用字符串数组时,一切正常,但我没有布尔值来判断是否有人已经投票。我对编程很陌生,不知道问题出在哪里。有人能解释一下什么地方出了问题以及如何解决吗 方法,其中读取文本文件并填充数组(学生被全局声明和构造,最初大小为0): 学生对象:Java 从文本文件向动态数组中输入数据时出现NullPointerException,java,arrays,object,nullpointerexception,java.util.scanner,Java,Arrays,Object,Nullpointerexception,Java.util.scanner,我正在制作一个投票系统,用户用自己的学生号登录并进行选择。一旦有人投票,他们就无法再次登录。我做了一个物体;学生,包含学生编号的字符串和该学生编号是否已投票的布尔值(两者都是私有的)。我制作了一个这种类型的动态数组,以接受通过扫描仪读取的文本文件中给定数量的学生。但是,当我尝试在对象数组中填充student number字符串时,会得到一个NullPointerException。扫描仪正在从文本文件中读取信息,但当我尝试将信息放入Student对象的私有字符串时,会发生错误。当我使用字符串数组
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)
提前谢谢 您忘记初始化新的
Student
变量:
students = newData;
}
students[a] = new Student(); // not sure what your ctor is..
students[a].setStudentNumber(fileReader.nextLine()); //Error occurs here
a++;
顺便问一句,学生证里除了数字以外还有别的东西吗?作为字符串
有意义吗?long
更有意义吗?:)只是想一想
哦,如果这样做了,要使代码正常工作,请使用将
字符串
转换为长
您忘记初始化新的Student
变量:
students = newData;
}
students[a] = new Student(); // not sure what your ctor is..
students[a].setStudentNumber(fileReader.nextLine()); //Error occurs here
a++;
顺便问一句,学生证里除了数字以外还有别的东西吗?作为字符串
有意义吗?long
更有意义吗?:)只是想一想
哦,如果这样做了,要使代码正常工作,请使用将字符串
转换为长
更换
students[a].setStudentNumber(fileReader.nextLine());
与
替换
students[a].setStudentNumber(fileReader.nextLine());
与
学生
初始化是否正确?你能把你在代码中初始化的代码放在代码>学生< /COD>?<代码>学生[A] < /COD>必须是NULL。你可能还想考虑使用<代码> ARARYLISTAB/COD>,而不是使用<代码>学生[]/COD>。add(…)
方法将方便您进行讨厌的数组复制和扩展,并且它将运行得更快(您当前的算法是O(N^2),而不是O(N))。学生是全局初始化和构造的,很抱歉,这里忘了提一下:static Student[]Student=new Student[0];学生
初始化是否正确?你能把你在代码中初始化的代码放在代码>学生< /COD>?<代码>学生[A] < /COD>必须是NULL。你可能还想考虑使用<代码> ARARYLISTAB/COD>,而不是使用<代码>学生[]/COD>。add(…)
方法将方便您进行讨厌的数组复制和扩展,并且它将运行得更快(您当前的算法是O(N^2),而不是O(N))。学生是全局初始化和构造的,很抱歉,这里忘了提一下:static Student[]Student=new Student[0];抱歉,忘了提到我全局初始化了它,并将其大小设置为0@user您已初始化数组,但未初始化其元素。您所说的“我的元素未被初始化”是什么意思?当您将数组的大小初始化为零时,您从未将元素设置为任何东西,因为没有任何元素。您必须始终创建新元素以放入数组中。通过调整数组的大小,您不需要创建元素,只需要为元素分配空间(从技术上讲是指针,但现在忽略这一点)。因此,您需要为每个元素创建一个new
对象,即new Student()
——否则它们都是空的。对不起,忘了提到我全局初始化了它,并将其大小设置为0@user你已经初始化了数组,但不是它的元素。你说我的元素没有被初始化是什么意思?当你将数组初始化为零大小时,你从不将元素设置为任何东西,因为没有。您必须始终创建新元素以放入数组中。通过调整数组的大小,您不需要创建元素,只需要为元素分配空间(从技术上讲是指针,但现在忽略这一点)。因此,您需要为每个元素创建一个new
对象,即newstudent()
——否则它们都为空。