将对象数组中的项替换为null(java)
我开始在我的课程中学习面向对象,我们有一个叫做将对象数组中的项替换为null(java),java,arrays,object,null,Java,Arrays,Object,Null,我开始在我的课程中学习面向对象,我们有一个叫做学生的对象类。students类的对象存储实例变量:studentName、studentNumber和studentGPA。我的对象类中有一个布尔方法,用于确定该学生是否是失败的学生(如果他们的GPA大于2.0,则该学生是失败的),然后我的工人类中有一个方法,该方法应该接受学生对象的数组,如果该学生失败,则该方法将该对象替换为“null” 我的问题是,我很难用null替换students对象,因为java不断抛出我或类似的东西。以下是我尝试过的:
学生的对象类。students
类的对象存储实例变量:studentName
、studentNumber
和studentGPA
。我的对象类中有一个布尔方法,用于确定该学生是否是失败的学生(如果他们的GPA大于2.0,则该学生是失败的),然后我的工人类中有一个方法,该方法应该接受学生
对象的数组,如果该学生失败,则该方法将该对象替换为“null”
我的问题是,我很难用null替换students对象,因为java不断抛出我或类似的东西。以下是我尝试过的:
public static void removeFailingStudents(Student[] students)
{
int count;
for (count=0; count<students.length; count++)
{
if(students[count].isFailing())
{
students[count] = null;
}
}
}
以下是异常消息:
java.lang.NullPointerException
at L2Q1.printStudents(L2Q1.java:41)
at L2Q1.process(L2Q1.java:28)
at L2Q1.main(L2Q1.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
这是因为您已经删除了一些学生,将他们从Student
转到null
。您正在尝试对一个不存在的学生调用null
我建议您将数组替换为ArrayList
,实际上可以从中删除元素。或者,您可以在删除学生时重建阵列。问题
您正在使学生
数组中的元素为空。然后尝试在null
元素上使用toString()
。这就是它的样子:null.toString()
,显然这是不好的
无阵列列表的解决方案
在评论中,人们提出了一个建议。我假设这是家庭作业,您必须使用数组,因此您应该这样做:
跟踪阵列的大小。使用它来确定列表中有多少实元素、非空元素。像这样:
for(int i = 0; i < arraySize; i++)
{
// Do something with the array here.
}
请记住,您需要为每个新元素递增数组化,并在每次清空元素时递减
请记住,当您的程序完成时,数组的末尾将有一系列空值
黑客解决方案
与此同时,你可以对你的printstustudents()
——这是一种黑客行为,只是暂时的修复
public static void printStudents(Student[] students)
{
// Check if the array is null, good practice.
if(students == null)
return;
System.out.println("Students:");
for (int i = 0; i < students.length; i++)
{
// My hack: Check if element is null, if it is then skip it.
if(students[i] == null)
continue;
System.out.println(students[i].toString());
}
System.out.println();
}
公共静态无效学生(学生[]学生)
{
//检查数组是否为空,这是一种良好的做法。
如果(学生==null)
返回;
System.out.println(“学生:”);
for(int i=0;i
您正在将索引处的Student
对象设置为null
,然后使用另一种方法尝试调用toString()
对null
对象执行操作。使用List
将帮助您更优雅地处理此问题
在不重写整个代码的情况下,以下是如何实现List
:
public static void process() {
List<Student> students = new ArrayList<Student>();
List<Student> newStudents = new ArrayList<Student>();
...
如果要从列表中删除学生,请使用
students.remove(count);
要填充列表,请使用
Student student1 = new Student(7654321, "Lara Zhivago", 3.75);
students.add(student1);
....
你调用这个函数多少次?我只调用一次!在调用函数之前,数组中存在一个null
?否。数组中的所有项都初始化为null以外的值。Student[]是不可变的,这意味着初始化后不能更改大小。在我看来,试图将其设置为null是不好的。我认为你最好在这里使用ArrayList而不是Object[],因为你是在根据东西改变周围事物的大小,这是为了做作业,所以我确实需要保留学生的数组。谢谢黑客的解决方案将暂时适用!
public static void process() {
List<Student> students = new ArrayList<Student>();
List<Student> newStudents = new ArrayList<Student>();
...
for (int count = 0; count < students.size(); count++) {
//do stuff here
}
students.remove(count);
Student student1 = new Student(7654321, "Lara Zhivago", 3.75);
students.add(student1);
....