3

我设置了一个简单的数组列表,但似乎无法向其中添加对象。

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

有两个错误,一个在 inventory 和 add 之间的点处,一个在括号之间的变量名处,即

Syntax error on token(s), misplaced construct(s)

Syntax error on token "item1", VariableDeclaratorId expected after this token

谁能解释为什么会这样?

4

5 回答 5

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

于 2013-06-23T11:46:44.743 回答
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

于 2013-06-23T11:50:13.527 回答
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");
   }
}
于 2013-06-23T11:51:32.217 回答
3

非声明代码必须像 main 方法一样位于块语句中。如果您想在 Eclipse 中运行代码,例如在 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 编辑区的左边框设置一个断点并单步执行代码。

编辑:在我看来,亚当对代码进行了实验,我提供了一个使实验更容易的解决方案。

于 2013-06-23T11:54:27.587 回答
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);
}
于 2013-06-23T11:58:59.563 回答