【问题标题】:Can't add to an ArrayList "misplaced construct(s)"无法添加到 ArrayList “错位构造”
【发布时间】:2013-06-20 01:42:15
【问题描述】:

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

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

谁能解释为什么会这样?

【问题讨论】:

  • 这应该写在一个方法里面。
  • 另外,使用原始数组列表可能不是最好的主意,而是使用 ArrayList
  • 你也可以写Arrays.asList("Sword", "Potion", "Shield");
  • 反对票被赞成票取消。我不确定为什么有人会因为他们不是天生就知道 Java 而投反对票。这是一个完全有效的问题(尽管我可以看到它因重复而被关闭,因为它已在此站点上被问过 多次 次)。
  • @HovercraftFullOfEels 我同意。 +1 也来自我。

标签: java string arraylist


【解决方案1】:

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

试试这个:

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<String> 是最佳声明。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    像这样包裹在里面:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • ArrayList 库存是一个私有变量。
      • 没错。因为它是从同一个类访问的,所以它是可见的。
      • 但这不是一个糟糕的类设计吗?
      • 使数组列表比它必须的更明显是糟糕的设计。我现在将其设为私有,将初始化代码移至构造函数,在尖括号中添加库存项目的类型并将库存项目 ArrayList 重命名为inventoryItems
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 2013-02-19
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 2013-10-27
        • 2019-04-22
        • 2015-01-16
        相关资源
        最近更新 更多