我有一个简单的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
任何人都可以解释为什么会这样吗?
答案 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);
}