[英]Why am I getting NullPointerExceptions in my JSPs when I upgrade from Glassfish 3 to 4?
[英]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
作為參數添加到構造函數中 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.