为对象设置值时,为什么会收到NullPointerExceptions?

时间:2014-03-03 00:16:23

标签: java arrays object

我创建了一个具有ID,GPA和Credits值的类Student,然后在类StudentList中创建了100个数组元素。当尝试写入元素时,我得到NullPointerException。

学生班:

package com.ahellhound.pkg202studentrecordproject;

public class Student {
    private String studentID;
    private double studentGPA;
    private int creditHours;

    public void Student() {}

    public String getStudentID() {return studentID;}
    public void setStudentID(String studentID) {this.studentID = studentID;}

    public double getStudentGPA() {return studentGPA;}
    public void setStudentGPA(double studentGPA) {this.studentGPA = studentGPA;}

    public int getCreditHours() {return creditHours;}
    public void setCreditHours(int creditHours) {this.creditHours = creditHours;}

    /**
     * @return StudentID, StudentGPA, StudentCreditHours separated by spaces
     */
    @Override
    public String toString() {
        return String.format("%s %f.2 $d", studentID, studentGPA, creditHours);
    }

}

然后在StudentList中,我尝试将三个参数传递给它:

    private Student[] studentArray = new Student[100];
private int counter = 0;

public String addStudentRecord(String studentID, double studentGPA, int studentCredits){

    studentArray[counter].setStudentID(studentID);
    studentArray[counter].setStudentGPA(studentGPA);
    studentArray[counter].setCreditHours(studentCredits);
    String arrayString = studentArray[counter].toString();

    counter++;

    return arrayString;

}

4 个答案:

答案 0 :(得分:3)

这会创建一个最多可容纳100个Student对象的数组:

private Student[] studentArray = new Student[100]

但是它没有创建任何学生,因此每个单元格都包含null。

使用此行studentArray[counter].setStudentID(studentID);表示您尝试在空对象上调用setStudentID(studentID),因为studentArray[0]为空。

如何做到这一点的最佳方法是在Student类中创建构造函数

public Student(String studentID, double studentGPA, int creditHours) {
    this.studentID = studentID;
    this.studentGPA = studentGPA;
    this.creditHours = creditHours;
}

然后你可以添加学生:

studentArray[counter] = new Student(studentID, studentGPA, creditHours);

答案 1 :(得分:1)

在addStudentRecord中,首先将数组元素初始化为新学生:

studentArray[counter] = new Student();
// rest of your code

答案 2 :(得分:1)

其他人已经非常清楚地解释了确切的问题,但我可以提供一些额外的见解,以确定您如何能够首先防止这一问题成为问题。

代码的基本核心问题是导致此次事故的原因,studentID是可变的。你需要问问自己,“在任何时候,对象的学生ID都会改变吗?”。如果你的学校像真正的学校一样工作,那么答案就是坚定的没有,事实上,这就是拥有学生证的全部理由 - 这是永远不会改变的。因此,您不应该为该字段设置一个setter;它应该只在构造函数中初始化。 (您应该围绕hashCode实施studentID.hashCode()方法,并围绕equals实施studentID.equals()方法。)

当然,如果你只能在构造函数中初始化学生ID,那么当你添加一个记录时,你将不得不构建一个新的学生对象,如果你构造一个新的学生对象,那么你就不会有NullPointerException

所以:

  • 删除setStudentID
  • studentID作为参数添加到构造函数
  • Impelement hashCodeequals

答案 3 :(得分:0)

当您创建任何类型的数组时,您正在为某些对象集创建容器。 Java尝试为原始类型制定一些合理的默认值,例如将0分配给int数组的成员。但对于对象,唯一合理的默认值是null

对于您来说,这意味着您需要创建一个对象并在尝试访问其字段之前将其插入到数组中。

public String addStudentRecord(String studentID, double studentGPA, int studentCredits){
    studentArray[counter] = new Student();
    studentArray[counter].setStudentID(studentID);
    studentArray[counter].setStudentGPA(studentGPA);
    studentArray[counter].setCreditHours(studentCredits);
    String arrayString = studentArray[counter].toString();

    counter++;

    return arrayString;
}

如果studentArray [counter]为空,您可能还想考虑该怎么做。