Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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
将对象数组中的项替换为null(java)_Java_Arrays_Object_Null - Fatal编程技术网

将对象数组中的项替换为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);
....