2012-04-05 9 views
7

これはJavaで、クロスプラットフォームで、実行時にOpenJDKがインストールされたUbuntu Onericを実行しているコンピュータでデバッグされています。Java - EnumSet.add(enum)、NullPointerExceptionをスローする

私が取り組んでいるゲームでクラス内をチェックするためのEnumSetがあります。私は、logcatから、私のコンストラクタ内のデバッグをたくさん読んでいます:

Tile : passability being set...? 
Exception in thread "Thread-1" javax.media.opengl.GLException:java.lang.NullPointerException 
    ... 
Caused by: java.lang.NullPointerException 
    at net.darkglass.map.Tile.addPassability(Tile.java:144) 
    ... 

おかしいです。私はその関数の本体を意味

public void addPassability(Passability type) 
{ 
    this.passability.add(type); 
} 

れる:それを追跡、私の問題は、完全に、この行のようです。

this.addPassability(Passability.AIR); 

NullPointerExceptionが発生したときに、コンストラクタから呼び出されます。受動性列挙型の本体では、完全に列挙型保存パッケージの宣言のように、

public enum Passability 
{ 
    AIR, ALL, GROUND, NONE, SIGHT, SKILL, STRUCTURE, WATER; 
} 

があります。 this.passabilityは、クラス定義の先頭に

private EnumSet <Passability> passability; 

を宣言され、私はadd()メソッドは、Java標準でEnumSetの定義の一部として継承されたという印象の下にありました。

私は独学ですが、私は狂っていません。どちらかが間違っているか、これを行う良い方法があります。誰かが手を貸すことができる有益な知識を持っていますか?

+0

あなたのコードをより多く表示できますか?私が見ているのは、ここに一本の線があるならば。 – Adrian

+0

Jon Skeetはそれを持っています。 私はプリミティブの使用に慣れていたので、決して初期化していませんでした〜私は自分の仕事をキスしようとします。 –

答えて

16

だから、passability変数を宣言しましたが、あなたはそれがnullのデフォルト値以外の値を割り当てられているの兆候を示さなかっました。おそらく、あなたは意味:

private EnumSet<Passability> passability = EnumSet.noneOf(Passability.class); 

EnumSetは、他のどのようなオブジェクトです - あなたは明示的に変数を与えない限り、それはnullのデフォルト値を持つことになりますし、あなたがそれにaddを呼び出すとき、あなたが買ってあげますNullPointerException - これはまさにここで起こったことです。

+0

はい、ありがとうございます。しかし、私はそのメモにいくつかの懸念を持っています。今、それはフィールド宣言〜に追加されました〜それは本当に安全ですか、それともコンストラクタコールに移動する必要がありますか?コンストラクタの体内で ' ;' 上記アップ及び 'this.passability = EnumSet.noneOf(Passability.class)、 'プライベートEnumSetの通過性である ? –

+2

@ThatGuy:それは問題ありません。彼らはかなり同等です。 –

関連する問題