簡體   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