2013-06-23 30 views
3

我有一個簡單的數組列表設置,但我似乎無法添加對象。無法添加到ArrayList「錯位的結構」

import java.util.ArrayList; 


public class Inventory { 

ArrayList inventory = new ArrayList(); 

String item1 = "Sword"; 
String item2 = "Potion"; 
String item3 = "Shield"; 

inventory.add(item1); 
inventory.add(item2); 
inventory.add(item3); 
} 

有兩個誤區,一是在庫存和增加,以及一個在括號中的變量名之間的點,是

Syntax error on token(s), misplaced construct(s) 

Syntax error on token "item1", VariableDeclaratorId expected after this token 

誰能解釋爲什麼發生這種情況?

+8

這應該寫在一個方法。 – Maroun

+2

此外,使用raw arraylist可能不是最好的主意,而是使用ArrayList Zavior

+1

您也可以編寫'Arrays.asList(「Sword」,「Potion」,「Shield」);' – LaurentG

回答

12

你的代碼不工作的原因是你試圖在類體中編寫代碼。可執行語句應該寫在靜態初始化程序,方法或構造函數中(正如我在下面的例子中所做的那樣)。

嘗試這種情況:

public class Inventory { 

    private List inventory = new ArrayList(); 

    public Inventory() { 

     String item1 = "Sword"; 
     String item2 = "Potion"; 
     String item3 = "Shield"; 

     inventory.add(item1); 
     inventory.add(item2); 
     inventory.add(item3); 
    } 
} 

我在類體內定義的類構件inventory和就地(= new ArrayList();)初始化它。沒有編譯器錯誤,因爲在類體中允許聲明。我將其餘的代碼放入構造函數中,用值初始化inventory。我可以把它放在一個方法中,但我選擇了構造函數,因爲它的通常作用是初始化類成員。

+2

你可能想在旁邊說明一個工作代碼。解釋一下,我的中立投票將變成+1。 – Maroun

+0

這工作,謝謝!但是像其他人說的那樣,你能解釋一下爲什麼這是有效的? –

+0

查看mu更新後的答案 – darijan

6

在Java中,在方法或構造函數的定義之外,不能有可執行語句,例如調用add方法。聲明是可以的,但可執行語句不是。

您可以添加這些項目到一個名爲構造函數,但你也可以使用匿名初始化塊,像這樣的:如果你使用像塊

public class Inventory { 

    ArrayList inventory = new ArrayList(); 

    { // An anonymous initialization block 
     String item1 = "Sword"; 
     String item2 = "Potion"; 
     String item3 = "Shield"; 

     inventory.add(item1); 
     inventory.add(item2); 
     inventory.add(item3); 
    } 
} 

,它將所有命名的構造函數之間共享或者它將成爲Inventory的隱式生成構造函數的一部分。

+0

適用於mini-tuto。 – Akheloes

+0

感謝您的回答! –

5

您的「添加」語句只是「空中」:不在一個方法或構造函數內。

裹在裏面一個像例如:

public class Inventory { 

    private List inventory = new ArrayList(); //prefer interface here ;) 

    public Inventory(){ //statements wrap into this constructor 
     inventory.add("Sword"); 
     inventory.add("Potion"); 
     inventory.add("Shield"); 
    } 
} 
+0

+1列表'接口。 –

3

非申報代碼必須是在像的主要方法塊語句。 如果您想運行代碼,例如在Eclipse中使用的類鼠標右鍵單擊一個調試器,並選擇Debug as/Java Application你可以做這樣的:

import java.util.ArrayList; 

public class Inventory { 

private List<String> inventoryItems = new ArrayList<String>(); 

public Inventory(){ 
    String item1 = "Sword"; 
    String item2 = "Potion"; 
    String item3 = "Shield"; 

    inventoryItems.add(item1); 
    inventoryItems.add(item2); 
    inventoryItems.add(item3); 
} 

public static void main(String[] args) { 
    Inventory theInventory = new Inventory(); 
} 

} 

這樣你就可以在Eclipse的編輯區和步驟的左側邊框設置一個斷點通過代碼。

編輯:因爲它看起來像亞當實驗與代碼我提供了一個解決方案,使試驗更容易。

+0

ArrayList庫存是一個私有變量。 –

+0

那是正確的。由於它是從同一個類訪問的,因此它是可見的。 – Sandro

+0

但這不是一個糟糕的班級設計嗎? –

2

更一般的答案是類的主體是關於聲明而不是語句。對於在類體中發生的語句有特殊的規定,但必須將其明確標記爲類初始化程序或實例初始化程序。 由於賦值語句和語句僅在代碼塊(方法,構造函數,靜態初始值設定項等)中被允許。 所以你可以做如下,

public class Inventory { 

ArrayList inventory = new ArrayList(); 

String item1 = null; 
String item2 = null; 
String item3 = null; 

//initializer block 
{ 
item1="Sword"; 
item2="Potion"; 
item3="Shield"; 

inventory.add(item1); 
inventory.add(item2); 
inventory.add(item3); 
}