类中的Java字符串数组 - Eclipse中的卷曲大括号错误

时间:2013-01-25 09:07:16

标签: java arrays string curly-braces

我为此搜索了SO,并且看到了一些类似的问题,但没有特别提出这个问题(无论如何我都能找到)。

我在这两个语句之前和之后的行上收到了花括号/分号错误。它们是类的成员(不在类方法中)。当我删除数组赋值行(第二行)时,花括号/分号错误消失了。我傻眼了,但知道有一个简单的答案。

public class Test {
    private int var1 = 1;

    // These are the troublesome lines
    public String[] name = new String[10];
    name[0] = "Mary"; // When I remove this line, both the errors go away

    public int var2 = 10;
}

我得到的Eclipse(Juno)中的错误是:

Syntax error on token ";", { expected after this token

...关于“var1”行上的错误,并且:

Syntax error, insert "}" to complete Block

...在“var2”行。

我做错了什么?我尝试过不同的差异,比如:

(String) name[0] = "Mary";

......等等。

3 个答案:

答案 0 :(得分:6)

问题是这句话:

name[0] = "Mary";

不在方法,构造函数或实例初始值设定项中。只有声明(和初始值设定项)可以位于类的顶层 - 而不是语句。

我建议你把它放在构造函数中。

public Test() {
    names[0] = "Mary";
}

答案 1 :(得分:4)

public class Test {
    private int var1 = 1;


    // These are the troublesome lines
    public String[] name = new String[10];


    // Use a constructor for initialization or
    // declare the string array as   public String[] name = {"Mary" };
    public Test() {
       name[0] = "Mary"; // When I remove this line, both the errors go away
    }
    public int var2 = 10;
}

在java中,你必须将语句放入方法/块中。

例如

public class TestB {
    public String[] s = new String[10];


    {
        s[0] = "10";
    }

}

实际上是合法的(但我不会使用它,除了静态成员之外)

编辑:关于静态成员的澄清

通常我们必须使用纯静态对象,在这种情况下,提供初始化的简单方法是使用匿名静态块。类似的东西:

public class TestStatic {
   private String [] someStaticStringArray = new String [10];
   static {
       someStaticStringArray[0] = "foo";
       someStaticStringArray[1] = "bar";
   }
   // Or better with static HashMaps
   private static HashMap<String, String> hm = new HashMap<String, String>();
   static {
     hm.put("key", "val");
     hm.put("key2", "val2");
     hm.put("key3", "val3");
   }
}

对于静态数据成员,当我无法提供工厂方法或工厂对象时,我就是这样使用的。对于非静态数据成员,我更喜欢使用构造函数,即使匿名块也可以工作。

有很多方法可以在java中提供初始化,我猜个人品味是选择一个在另一个上的主要原因。

对于你的特殊情况,我会选择这样的事情:

public class TestC {
   // Static data member, constructor does not read data from XML
   private static YourDataObject obj = new YourDataObject();

   public static YourDataObject getInstance(String xmlFile) {
      // Read XML file

      // Actually initialize the instance
      obj.set...(); // 

      // return the instance
      return obj;
   }
}

答案 2 :(得分:1)

试试这个解决方案:

public String[] name = new String[10];

//  instance initializer code block comes
{
    name[0] = "Mary";
}

此代码块类似于静态初始化程序块(static { ... }),但在实例化时执行,此时变量已初始化。