2017-02-10 98 views
-2

我試圖通過在Stanovanje中使用int postle來獲取seznam2的長度。然而,可變getPostle()不及格,我得到線程「主」顯示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; 
    } 
} 
+5

您的問題很不清楚。請包括您收到的錯誤並考慮花費一些時間來明確您的問題。 –

+1

成員變量'stanovanje1'沒有顯式初始化,因此它是'null'; getStanovanje()方法返回null,然後嘗試在null上調用getPostle(),這會導致一個'NullPointerException'。 – Jesper

回答

1

1和2之間的差異:

/*1*/ Stanovanje stanovanje = new Stanovanje(); 
/*2*/ private Stanovanje stanovanje1; 

是:

1:具有默認的可見性(這是「包私人「)並立即初始化。 (不null

2:具有private的可見度並初始化(因此== null直到否則初始化)

時候使用那些很難回答,因爲也許很多情況下的你更喜歡這個或那個。

如果你使用第二個,你應該在構造函數中初始化它。通過在那裏創建一個實例,或者通過初始化一個CTOR-Argument來實現。否則,您的對象沒有正確初始化,並且使用可能會導致您遇到的情況:NPE等副作用。

在某些情況下(實際很少需要的重對象)可能會非常有用,直到真正需要時纔將它們初始化(有時稱爲「延遲加載」)。然後,人們會使用一個getter來檢查該字段是否已經初始化,如果不是,則返回它。

關於知名度,你可以在這裏閱讀:Controlling Access to Members of a Class(Oracle文檔) 神諭「經驗法則」有:

使用private,除非你有一個很好的理由不這樣做。

相關問題