无法添加到ArrayList“misplaced construct(s)”

时间:2013-06-23 11:43:32

标签: java string arraylist

我有一个简单的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

任何人都可以解释为什么会这样吗?

5 个答案:

答案 0 :(得分: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。我可以把它放在一个方法中,但我选择了构造函数,因为它通常的作用是初始化类成员。

答案 1 :(得分: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隐式生成的构造函数的一部分。

答案 2 :(得分: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");
   }
}

答案 3 :(得分: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编辑区域的左边界处设置断点,并逐步执行代码。

编辑:因为在我看来,亚当试验代码我提供了一个解决方案,使实验变得更容易。

答案 4 :(得分: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);
}