0

私はこれをSOで検索し、いくつかの同様の質問を見ましたが、具体的にはこの質問ではありません(とにかく見つけることができました)。

これらの2つのステートメントの前後の行で、中括弧/セミコロンエラーが発生します。それらはクラスのメンバーです(クラスメソッド内ではありません)。配列の割り当て行(2行目)を削除すると、中括弧/セミコロンのエラーがなくなります。私は唖然としましたが、これに対する簡単な答えがあることを知っています。

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

...等々。

4

3 に答える 3

6

問題は、次のステートメントです。

name[0] = "Mary";

メソッド、コンストラクター、またはインスタンス初期化子にはありません。クラスのトップレベルにできるのは宣言(および初期化子)だけであり、ステートメントではありません。

コンストラクターに入れることをお勧めします。

public Test() {
    names[0] = "Mary";
}
于 2013-01-25T09:09:18.320 に答える
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;
   }
}
于 2013-01-25T09:10:13.567 に答える
1

このソリューションを試してください:

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

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

このコードブロックは静的初期化ブロック( )に似てstatic { ... }いますが、変数が初期化されるインスタンス化時に実行されます。

于 2013-01-25T09:11:20.247 に答える