无法添加到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 

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

你的代码不起作用的原因是你试图在类体中编写代码。 可执行语句应该用静态初始化器,方法或构造函数编写(就像我在下面的例子中所做的那样)。

尝试这个:

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

在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的隐式生成的构造函数的一部分。

你的“添加”语句只是“在空中”:不在一个方法或构造函数中。

例如,在内部包裹:

 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"); } } 

非声明代码必须与主方法一样在块语句中。 如果您想在Eclipse中使用调试器运行代码,只需右键单击该类并选择Debug as / Java Application您就可以这样做:

 import java.util.ArrayList; public class Inventory { private List inventoryItems = new ArrayList(); 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编辑区域的左边界处设置断点,并逐步执行代码。

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

更一般的答案是类主体是关于声明而不是声明。 对于在类体中发生的语句有特殊规定,但它们必须明确标记为类初始值设定项或实例初始值设定项。 由于赋值是语句,因此只允许在代码块(方法,构造函数,静态初始化程序等)中使用语句。 所以你可以这样做,

 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); }