繁体   English   中英

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

[英]Why am I receiving NullPointerExceptions when setting values to an 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;

}

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

private Student[] studentArray = new Student[100]

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

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

最好的方法是在您的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);

在addStudentRecord内部,首先将array元素初始化为新学生:

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

确切的问题由其他人非常清楚地解释了,但是我可以提供一些其他的见解,以帮助您从一开始就如何准确地防止它成为问题。

代码的基本核心问题(导致此事故的原因)是studentID易变的事实。 您需要问自己:“该对象的学生证在任何时候都会改变吗?”。 如果您的学校的工作方式像真实学校一样,那么答案肯定是“ 否” ,实际上,这就是拥有学生证的全部原因-这是永远不会改变的。 因此,您不应该为该字段设置setter。 它只能在构造函数中初始化。 (您应该在studentID.hashCode()周围实现hashCode方法,而在studentID.equals()周围studentID.equals() equals方法。)

当然,如果只能在构造函数中初始化学生ID,则在添加记录时,您将必须构造一个新的Student对象,而如果您构造一个新的Student对象,则将没有NullPointerException

所以:

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

创建任何类型的数组时,都在为某些对象集创建容器。 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]为null时该怎么办。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM