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

时间:2017-02-10 10:48:39

标签: java arrays variables object access

我试图通过在Stanovanje中使用int postle来获取seznam2的长度。但是,变量getPostle()没有通过,我在线程" main"中得到了Exception。此行的java.lang.NullPointerException错误:

private String[] seznam2 = new String[getStanovanje().getPostle()]. 

我还想知道何时使用:

Stanovanje stanovanje = new Stanovanje(); 

private Stanovanje stanovanje1; 

这是我的代码:

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();
    }
}

Stanovanje.java

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 个答案:

答案 0 :(得分:1)

1和2之间的区别:

#1048 - Column 'created_date' cannot be null

是:

1:具有默认可见性(即“package-private”)并立即初始化。 (不是/*1*/ Stanovanje stanovanje = new Stanovanje(); /*2*/ private Stanovanje stanovanje1;

2:null可见度且初始化(因此== private,直到另行初始化)

何时使用这些内容很难回答,因为很多情况下您可能更喜欢这一种。

如果使用第二个,则应在构造函数中初始化它。通过在那里创建实例或将其初始化为CTOR-Argument。否则,您的对象未正确初始化,并且使用会导致您遇到的问题:像NPE这样的副作用。

在某些情况下(实际上很少需要的重物),在真正需要之前将它们保持未初始化(有时称为“延迟加载”)会很有用。然后,人们将使用一个getter来检查字段是否已经初始化,如果没有,则在返回之前这样做。

关于可见性,您可以在此处阅读:Controlling Access to Members of a Class(Oracle文档) 那里的神谕“经验法则”:

  

使用null除非你有充分的理由不这样做。