[英]How to access a private object within a private object in Java?
我試圖在這里訪問一個對象中的一個對象。 下面是三個類。 我對此進行了簡化,使其與完整程序中的錯誤相同。 這是主類。
import java.util.Scanner;
public class TestMain
{
public static void main (String[] args)
{
createStudent();
}
public static Student createStudent()
{
Student another = new Student();
another.depart(101,"CS");
return another;
}
}
第二個,
public class Student
{
private int sid;
private String sname;
private Department department;
public int getSid()
{
return sid;
}
public String getSname()
{
return sname;
}
public void depart(int departid, String departname)
{
department.setDid(departid);
department.setDname(departname);
}
public void setSid(int stusid)
{
this.sid = stusid;
}
public void setSname(String stusname)
{
this.sname = stusname;
}
}
第三個,
public class Department
{
private int did;
private String dname;
public int getDid()
{
return did;
}
public String getDname()
{
return dname;
}
public void setDid(int deptdid)
{
this.did = deptdid;
}
public void setDname(String deptdname)
{
this.dname = deptdname;
}
}
不管我做什么,這個程序都會返回一個運行時錯誤,
Exception in thread "main" java.lang.NullPointerException
at Student.depart(Student.java:17)
at TestMain.createStudent(TestMain.java:13)
at TestMain.main(TestMain.java:7)
什么是NullPointerException
以及如何避免這種情況? 請幫我。
問題是當你創建一個Student對象時,你需要初始化每個成員對象,即department
對象為null,所以當你執行department.setDid(101)
,它會返回一個異常。
要解決此問題,請為 Student 類創建一個自定義構造函數,如下所示:
Student()
{
department = new Department();
sid = 0;
sname = "";
}
編輯:正如塞巴斯蒂安在下面的評論中正確指出的那樣,實際上沒有必要在構造函數中初始化原始類型。 但是,請注意,您必須對 String 類型執行此操作,因為它們的默認值是null
,而不是""
,這可能會在以后導致問題。
發生異常是因為您沒有在離開方法中創建對象。 你可以使用這個:
public void depart(int departid, String departname)
{
department = new Department();
department.setDid(departid);
department.setDname(departname);
}
在你的部門類中,你沒有創建部門的實例,部門字段為空,而是使用這個:department = new Department();
public void depart(int departid, String departname){
department = new Department();
department.setDid(departid);
department.setDname(departname);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.