Java 对象和变量对象之间的区别

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(); 或 这是我的密码:

我试图通过使用Stanovanje中的int-postle获得seznam2的长度。但是,变量getPostle()没有通过,我在线程“main”java.lang.NullPointerException中得到了这一行的异常:

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;