2017-02-10 7 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のような副作用が発生する可能性があります。

実際にはほとんど必要とされない重いオブジェクトが本当に必要になるまで(「レイジーローディング」と呼ばれることもある)、初期化されていない状態にすると便利です。次に、フィールドが初期化されているかどうかをチェックするゲッターを使用します。 Controlling Access to Members of a Class(Oracleドキュメント)が オラクル、「経験則」:

使用privateをあなたはしないように十分な理由がない限り、あなたはここで読むことができ、視認性について

関連する問題