0

私はすでに持っているコードを実行する別の方法を試していましたが、それは私が不法であると感じ、この例外に遭遇しました。私は何が起こっているのか本当に理解していません、私はまだJavaに非常に慣れていません。

コードが少し多ければ申し訳ありませんが、それ以上カットすることはできないと思います。例外は、の最初の行で発生しInitialize()ます。

正確なエラーメッセージは次のとおりです。

スレッド"main"の例外simulationia.CritterInfo.Initialize(Critter.java:35)のsimulationia.SimulationIA.main(SimulationIA.java:21)のjava.lang.NullPointerException

35行目はの最初の行ですInitialize()。SimulationIAの21行目は、への呼び出しInitialize()です。

// Critter.java
class CritterInfo { 
    static private Map<Object, String> enum_desc;

    public enum CRITTER_TYPE { CT_HERBIVORE, CT_CARNIVORE }
    public enum CRITTER_STATE { CS_FULL, CS_HUNGRY, CS_STARVING, CS_DEAD }

    /* ... */

    static void Initialize() {
        enum_desc.put((Object)CRITTER_TYPE.CT_HERBIVORE,    "Herbivore");
        enum_desc.put((Object)CRITTER_TYPE.CT_CARNIVORE,    "Carnivore");
        enum_desc.put((Object)CRITTER_STATE.CS_FULL,        "Full");
        enum_desc.put((Object)CRITTER_STATE.CS_HUNGRY,      "Hungry");
        enum_desc.put((Object)CRITTER_STATE.CS_STARVING,    "Starving");
        enum_desc.put((Object)CRITTER_STATE.CS_DEAD,        "Dead");
    }

    /* ... */
}   

他のファイル...

// SimulationIA.java
public class SimulationIA {
    public static void main(String[] args) {
        /* ... */

        CritterInfo.Initialize();

        /* ... */
    }
}

基本的に私がやろうとしているのは、タイプを気にせずにすべての列挙値を保持する単一のマップを作成することinstanceofです。多分これは実行不可能です。

編集:これは、実際のオブジェクトを使用せず、列挙型の値のみを使用するため、nullポインターについて不平を言うという事実に関係している可能性があると思います。そうですか?これをどのように回避しますか?

4

3 に答える 3

5

マップを作成することは決してないので、putで呼び出されnullます。

たとえば、次のようなことを行う必要があります。

static private Map<Object, String> enum_desc = new HashMap<Object, String>();
于 2012-10-08T01:08:23.067 に答える
2

あなたのコメントに基づいて、「私はすべての列挙値に一致するテキストの説明を持っていることができるようにしたいだけです」:

Javaの列挙型を利用できます。

public enum Enum {

    DOG("Dogs are cool"),
    CAT("Dogs are better"),
    GOAT("Free milk");

    private final String desc;

    private Enum(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }    

}
于 2012-10-08T01:18:51.063 に答える
2

基本から始めましょう...

public enum CRITTER_TYPE { CT_HERBIVORE, CT_CARNIVORE }
public enum CRITTER_STATE { CS_FULL, CS_HUNGRY, CS_STARVING, CS_DEAD }

public static void main(String[] args) {
    for (CRITTER_TYPE type : CRITTER_TYPE.values()) {
        System.out.println(type);
    }
}

出力します

CT_HERBIVORE
CT_CARNIVORE

したがって、anはそのメソッドを介してviaenumの「名前」を出力することがわかっています。enumtoString

を説明的にすることができるので、これは知っておくとよいでしょうenum

これが十分でない場合(スペースのサポートがない場合、またはもう少しフレンドリーなものが必要な場合)、次のようなことを行うことができます...

public enum CRITTER_TYPE {
    CT_HERBIVORE("Herbivore"),
    CT_CARNIVORE("Carnivore");

    private String description;
    private CRITTER_TYPE(String desc) {
        description = desc;
    }

    public String getDescription() {
        return description;
    }

}

public static void main(String[] args) {
    for (CRITTER_TYPE type : CRITTER_TYPE.values()) {
        System.out.println(type.getDescription());
    }
}

どの出力

Herbivore
Carnivore

enumJavaでは特別なタイプのオブジェクトです。詳細については、列挙型を一読してください。

于 2012-10-08T01:20:02.133 に答える