2016-06-30 31 views
0

我有一個ArrayList類作爲成員變量如何在構建方法中將值賦給Java類的ArrayList成員變量?

public class Tile { 
    private final String Name; 
    private final ArrayList<Integer> sides; 

    public Tile (String name, int up, int right,int down, int left){ 

     this.Name = name; 
     this.sides.add(up); 

    } 
} 

因此,當我創建瓷磚對象我想要設置的上,右,下,左值到4對象陣列用於瓷磚類。通過上面的代碼,我從NetBean得到一個錯誤,「可能的方面可能尚未初始化」。我不確定這是什麼意思,因爲我試圖用構建方法初始化它。

從NetBean尋求幫助最終得到了以下錯誤。

this.sides.set(0, up); 

我是新來的Java,所以如果有人能提供一些我在找上我無法理解的概念有些指令。

謝謝

+0

「初始化」一個變量意味着給它賦值(用'=')。由於'sides'沒有被設置,所以調用'.add()'是沒有意義的。 – dimo414

+0

謝謝dim414 無論誰投下我的問題,謝謝。正如我所說,我是新手。 – JamesA

+0

這個問題很清楚,imo +1。 – kazenorin

回答

3

你有這已經說明你的問題的消息variable sides might not have been initialized。您必須首先初始化邊陣列列表。

像這樣:

private final ArrayList<Integer> sides = new ArrayList<>(); 

或者添加之前對象身體兩側列表中,這樣在構造函數中:

public Tile (String name, int up, int right,int down, int left){ 
    sides = new ArrayList<Integer>(); 
    this.Name = name; 
    this.sides.add(up); 
} 
2

解決方案

修改:

private final ArrayList<Integer> sides; 

private final ArrayList<Integer> sides = new ArrayList<>(); 

原因

Java不自動初始化變量,對你來說,sides仍然初始化(如null)當您試圖.add的東西給它。

您可能會注意到,你不總是必須初始化構造時/聲明變量,但你已經做了兩兩件事,需要你在你的代碼來初始化sides

  1. 你有在side 變量與final關鍵字final關鍵字確保他們只會建設/聲明期間被分配恰好一次。如果不這樣做將導致編譯錯誤:「variable yourVarNameHere might not have been initialized

  2. 您在構造函數中使用 這side更多的是語義問題。您會注意到,如果刪除final關鍵字,但錯誤消失,但在執行程序時會遇到NullPointerException。原因在於我的第一段:sides仍然是未初始化的(如null)當你試圖.add東西給它。

0

需要初始化爲sides對象:

private final ArrayList<Integer> sides = new ArrayList<Integer>(); 
-1

The reason its failing is that you have never initialized sides list.

這基本上有getter或init塊的優點。我可以看到在幾個地方這樣的問題,所以剛剛上市了所有的更好的地方來初始化這些變量:

因此而不是調用變量直接與消氣

this.sides.add(up); 

你可以有雙方一個getter這樣

public getSides(){ 
if(this.sides == null){ 
this.sides = new ArrayList<Integer>(); 
} 
//you can also add even more validations here before anyone access it 
return this.getSides(); 
} 

,因此,您可以像增加值this.getSides()。add(up);

2.初始化塊

初始化塊是在每一個構造之前,那叫一個。所以萬一你有多個重載的構造函數。你只能有一個初始化塊這樣的:

{ 
this.sides = new ArrayList<Integer>(); 
} 

3.定義,同時聲明

您還可以在聲明本身的時間定義象下面這樣的變量:

private final ArrayList<Integer> sides = new ArrayList<Integer>(); 

4.構造函數

不建議在多個構造的情況下RS,但仍然可以在每個構造這樣

 public Tile (String name, int up, int right,int down, int left){ 
     this.sides = new ArrayList<Integer>(); 
     this.Name = name; 
     this.sides.add(up); 

    } 

5. init()方法把它定義

您也可以創建自己的init方法來initalize所有這些變量並調用它在每一個重載的構造像如下:

public void init() { 
this.sides = new ArrayList<Integer>(); 
} 

然後在init塊或構造函數中調用此函數。

希望能幫到你。

+0

我不知道誰低估了這個...但是它很好地分享原因,以便將來有一個改進的空間。提前致謝。 –

+1

我同意,我想也許是同一個人投下我的問題。 – JamesA

相關問題