8

これはJavaであり、クロスプラットフォームであり、ランタイムとしてOpenJDKがインストールされたUbuntu Onericを実行しているコンピューターでデバッグされています。

私が取り組んでいるゲームのクラス内をチェックするための 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 が発生した場合。Passability Enum Type の本体には、

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

文字通り、enum 保存パッケージ宣言全体として。this.passability が宣言されています

private EnumSet <Passability> passability;

クラス定義の冒頭で、Java 標準の EnumSet の定義の一部として add() メソッドが継承されているという印象を受けました。

私は独学ですが、頭がおかしいわけではありません。私が何か間違っているか、これを行うためのより良い方法があります。役に立つ知識をお持ちで、手を貸していただける方はいらっしゃいますか?

4

1 に答える 1

17

したがって、変数を宣言passabilityしましたが、デフォルト値以外の値が割り当てられている兆候は見られませんでしたnull。おそらくあなたは次のことを意味しました:

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

AnEnumSetは、他のオブジェクトと同様にオブジェクトです。したがって、変数を明示的に指定しない限り、デフォルト値の が設定され、それnullを呼び出すとadd、 - が得られますNullPointerException。これがまさにここで起こったことです。

于 2012-04-05T16:10:06.187 に答える