我设置了一个简单的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

谁能解释为什么会这样?

这应该写在方法内部。

另外,使用原始arraylist可能不是最好的主意,而是使用ArrayList

您也可以写Arrays.asList("Sword","Potion","Shield");

下票由上票取消。我不确定为什么有人会拒绝投票,因为他们不是天生就懂Java。这是一个完全有效的问题(尽管我可以看到它由于重复而被关闭,因为在此站点已被多次询问)。

@HovercraftFullOfEels我同意。我也+1。

@HovercraftFullOfEels同意。

@AdamMiszczak现有的答案确实可以解决您的问题,但值得注意的是,以通用形式使用ArrayLists可能有点不愉快(它们包含Objects,如果您知道它们是String,则可以将其强制转换为String x4>,但它可以包含任何对象),使用它们的一种更令人愉悦的方法是声明它们包含哪种对象,因此ArrayListinventory =new ArrayList();。现在,您只能将Strings放入arraylist中,并且get()方法将直接返回Strings

如何在Java中将字符串添加到ArrayList中可能重复?

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

尝试这个:

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。

这行得通,谢谢! 但是,就像其他人所说的那样,您能否解释一下为什么行得通?

查看亩更新的答案

1+可改善答案。

我肯定会添加一些关于为什么应该使用List而不是ArrayList的信息,以及为什么List是最佳声明的原因。

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

迷你兔兔+1。

感谢您的回答!

您的"添加"语句只是"悬而未决":不在一个方法或构造函数中。

包裹在一个内部,例如:

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

List接口的+1。

像main方法一样,非声明代码也必须放在block语句中。

如果您想运行代码,例如在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编辑区域的左边界设置一个断点,并逐步执行代码。

编辑:在我看来,亚当(Adam)使用该代码进行了实验,我提供了一个使实验变得更容易的解决方案。

ArrayList库存是一个私有变量。

没错。 由于它是从同一类访问的,因此它是可见的。

但这不是一个糟糕的课堂设计吗?

使数组列表比必须的列表更具可见性是不好的设计。 我现在将其设为私有,将初始化代码移至构造函数,在尖括号中添加库存商品的类型,并将库存商品ArrayList重命名为inventoryItems。

一个更笼统的答案是类主体是关于声明而不是语句。对于在类主体中发生的语句有特殊规定,但是必须将它们显式标记为类初始化程序或实例初始化程序。

由于分配是语句,因此语句只能在代码块(方法,构造函数,静态初始化器等)内部使用。

因此,您可以执行以下操作

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