2013-06-23 3 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 (« Меч »,« Зелье »,« Щит »);' – 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

+1 для мини-туто. – Akheloes

+0

Спасибо за ответ! –

5

Ваши заявления «добавления» просто «в воздухе»: не внутри одного метода или конструктора.

Wrap в внутри одного типа, например:

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 для интерфейса 'List'. –

3

Non объявляя код должен быть в блоке заявления, как основного метода. Если вы хотите запустить код, например. в 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); 
}