2012-03-07 48 views
2

ここで私はJavaを知っていると思っていますが、エラーVariable 'storage' might not have been initializedが発生します。ここに私のコードは:変数が初期化されていない可能性があります

public class RobbleSet { 
    private final Set<Robble> storage; // Error occurs here 

    public RobbleSet() { 
     storage = new HashSet<Robble>(); 
    } 

    public addRobble(Robble r) { 
     storage.add(r); // Error occurs here too 
    } 
} 

storageがコンストラクタで初期化されています。何がありますか?

+2

これは、*唯一の*コンストラクタであることを確認したい場合があります。コンストラクタが複数ある場合は、それらのすべてがコンストラクタを初期化する必要があります。さらに良いことに、 'private final Set storage = new HashSet ();'と書いておけば、コンストラクタに入れる必要はありません。 :-) – ruakh

+0

私は間違いなく1つのコンストラクタしか持っていません。コンストラクタではなく、フィールドでの初期化の技術的な違い(バイトコード/実行レベル)はありますか? –

+0

私はちょうど答えを掲示しました - あなたは同じことを言ってあなたの質問を編集したことがわかります。ある場所での初期化と他の場所での初期化との間の技術的な違いについて:そうではありません。私が理解しているところでは、違いはソースコードからバイトコードに伝えられます(あるバージョンはコンストラクタの代わりに 'init'メソッドに入っているので)、実際の*効果はありません。 – ruakh

答えて

5

問題は、addRobbleの戻り値の型を宣言していないことです。これに

public addRobble(Robble r) { 

:あなたはこれを変更する必要が

public void addRobble(Robble r) { 

私はそれが失敗したことを不平を言っている、これはあなたのコンパイラがaddRobbleがmisnamedコンストラクタであると考えて問題—であると思われますstorage —を初期化しますが、それがの問題ではなくても、の問題であることは明らかですが、それは確かにの問題です。

+0

+1私もそれに気付きましたが、私は彼がその場合に違う誤りを見ると思っていたでしょう。 – Aaron

2

addRobbleは戻り値の型を持たないため、スタティック・アナライザはコンストラクタとしてRobbleSetと呼ばれていなくてもそれをピックアップします。適切なコードは次のとおりです:

public class RobbleSet { 
    private final Set<Robble> storage; // Error occurs here 

    public RobbleSet() { 
     storage = new HashSet<Robble>(); 
    } 

    public void addRobble(Robble r) { 
     storage.add(r); // Error occurs here too 
    } 
} 
関連する問題