2014-03-03 41 views
0

我创建了一个具有ID,GPA和Credits值的班级学生,然后在班级StudentList中创建了100个数组元素。当试图写入元素时,我得到NullPointerException。为什么在为对象设置值时收到NullPointerExceptions?

学生类:

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; 

} 

回答

3

这产生阵列,其可容纳学生的100目的:

private Student[] studentArray = new Student[100]

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

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

如何做到这一点的最好办法是在你的学生类

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

内addStudentRecord,第一个数组元素初始化新学生:

studentArray[counter] = new Student(); 
// rest of your code 
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]为空,您可能还想考虑该怎么做。

1

确切的问题已被其他人很清楚地解释了,但我可以提供一些额外的见解,以确定如何防止此问题首先出现。

代码的基本核心问题是造成这种不幸的原因是studentID是可变的。你需要问自己:“任何时候,对象的学生证号都会改变?”。如果你的学校像真正的学校一样工作,答案是坚决的没有,事实上,这是拥有学生证的全部原因 - 这是永远不会改变的。正因为如此,你不应该为这个领域设置一个安装者。它只应该在构造函数中初始化。 (您应该围绕studentID.equals()执行围绕studentID.hashCode()hashCode方法和equals方法。)

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

所以:

  • 删除setStudentID
  • 作为参数添加到studentID构造
  • 教学贯彻hashCodeequals
相关问题