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