Java 对象和变量对象之间的区别
我试图通过使用Stanovanje中的int-postle获得seznam2的长度。但是,变量getPostle()没有通过,我在线程“main”java.lang.NullPointerException中得到了这一行的异常:Java 对象和变量对象之间的区别,java,arrays,object,variables,Java,Arrays,Object,Variables,我试图通过使用Stanovanje中的int-postle获得seznam2的长度。但是,变量getPostle()没有通过,我在线程“main”java.lang.NullPointerException中得到了这一行的异常: private String[] seznam2 = new String[getStanovanje().getPostle()]. 我还想知道何时使用: Stanovanje stanovanje = new Stanovanje(); 或 这是我的密码:
private String[] seznam2 = new String[getStanovanje().getPostle()].
我还想知道何时使用:
Stanovanje stanovanje = new Stanovanje();
或
这是我的密码:
Potovanje.java
public class Potovanje {
Stanovanje stanovanje = new Stanovanje();
private Stanovanje stanovanje1;
private String datumOdhoda;
private int trajanje;
private Popotnik[] popotnik;
private ArrayList<Popotnik> seznam = new ArrayList<>();
private String[] seznam2 = new String[getStanovanje().getPostle()];
public Potovanje(String datumOdhoda, int trajanje){
this.datumOdhoda = datumOdhoda;
this.trajanje = trajanje;
}
public void setStanovanje(Stanovanje stanovanje1){
this.stanovanje1 = stanovanje1;
}
public Stanovanje getStanovanje(){
return stanovanje1;
}
public void setPopotnik(Popotnik[] popotnik){
this.popotnik = popotnik;
}
public Popotnik[] getPopotnik(){
return popotnik;
}
public ArrayList<Popotnik> getSeznam(){
return seznam;
}
public void setSeznam2(String[] seznam2){
this.seznam2 = seznam2;
}
public String[] getSeznam2(){
return seznam2;
}
public void dodajPotnika(Popotnik[] popotnik){
//System.out.println("postle: " + stanovanje.getPostle());
for(int i=0; i<getSeznam2().length; i++){
//System.out.println("wadap");
setPopotnik(popotnik);
seznam.add(getPopotnik()[i]);
}
}
public String toString(){
return "datumOdhoda: " + datumOdhoda + "\n" + "trajanje: " + trajanje + "\n" + "popotnik: " + getPopotnik();
}
}
public class Stanovanje {
private int postle;
public Stanovanje(){
}
public Stanovanje(int postle){
this.postle = postle;
}
public void setPostle(int postle){
this.postle = postle;
}
public int getPostle(){
return postle;
}
public String toString(){
return "postle: " + postle;
}
}
1和2之间的差异:
/*1*/ Stanovanje stanovanje = new Stanovanje();
/*2*/ private Stanovanje stanovanje1;
是:
1:具有默认可见性(即“包专用”),并立即初始化。(非null
)
2:具有private
可见性,并且未初始化(因此==null
,除非另外初始化)
什么时候使用这两种方法很难回答,因为可能有很多情况下你更喜欢其中一种
如果使用第二个,则应在构造函数中初始化它。或者在那里创建一个实例,或者将其初始化为一个CTOR参数。否则,您的对象没有正确初始化,使用可能会导致您遇到:NPE之类的副作用
在某些情况下(很少实际需要的重对象),在真正需要之前将其保持为未初始化状态(有时称为“延迟加载”)会很有用。然后使用getter检查字段是否已初始化,如果未初始化,则在返回字段之前进行初始化
关于可见性,您可以在此处阅读:(Oracle文档)
神谕“经验法则”在那里:
使用private
,除非你有充分理由不这样做
你的问题很不清楚。请包含您所接收的错误,并考虑花一些时间来更清楚地表述您的问题。成员变量<代码> StasoVunj1 < /代码>未显式初始化,因此是<代码> null < /代码>;方法
getStanovanje()
返回null
,然后您尝试在null
上调用getPostle()
,这会导致NullPointerException
。
/*1*/ Stanovanje stanovanje = new Stanovanje();
/*2*/ private Stanovanje stanovanje1;