0

我有一种从学生数组中删除学生的方法。这是我到目前为止所拥有的,但似乎不起作用。

public Student[] removeStudent(Student s) throws Exception{
    boolean found =  false;
    for(int i = 0; i < nrStudents(this); i++){
        if(students[i].equals(s)){
            students[i] = null;
            found = true;
            break;
        }

    }
    if (found == true){
        return compact(students);
    }
    else
        throw new Exception("Student Not Found.");
}

private Student[] compact(Student[] arr){
    ArrayList<Student> list = new ArrayList<Student>();
    for (Student s : arr){
        if (!s.equals(null))
            list.add(s);
    }
    arr = list.toArray(new Student[list.size()]);
    return arr;
}

当我在数组中有 2 个或更多学生时,我得到一个 NullPointerException。如何从该数组中删除学生?

4

4 回答 4

3

不要使用 .equals() 来检查 null - 修复您的代码将if(!s.equals(null))行更改为if (s != null).

为什么?

Java null 检查为什么使用 == 而不是 .equals()

对于这个问题,使用 ArrayList 更有意义。我建议查一下——有几个很好的用法示例和来源。

于 2013-01-21T18:45:57.903 回答
0

我很确定您必须将除空数据之外的所有数据复制到一个全新的数组中。鉴于这是一项昂贵的操作,我推荐 ArrayLists http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

使用数组列表,您可以获得能够按索引引用的好处,但您也可以使用以下方法简单地删除元素:

if(node.data==null) {
     remove(node);
}
于 2013-01-21T18:46:21.500 回答
0

以下:

    if (!s.equals(null))

应该读

    if (s != null)
于 2013-01-21T18:47:19.023 回答
0

这就是我所做的修复它

private Student[] compact(Student[] arr){
    Student[] stud = new Student[arr.length];
    int count = 0;
    for(int i = 0; i < arr.length; i++){
        if(arr[i] != null){
            stud[count] = arr[i];
            count++;
        }
    }
    students = stud;
    return students;
}

我首先将 student 设置为 null,然后我使用 compact 辅助方法来压缩数组,因此它没有 null 元素。

于 2013-01-21T18:58:33.243 回答