NullPtrException Java在Map中使用枚举

时间:2012-10-08 01:06:18

标签: java

我正在尝试另外一种方法来做一些我已经拥有的代码,我发现它不够优雅,我遇到了这个例外。我真的不明白发生了什么,我还是Java的新手。

我很抱歉,如果有一些代码,但我认为我不能削减更多。 Initialize()的第一行引发了异常。

以下是确切的错误消息:

  

线程“main”中的异常java.lang.NullPointerException at   simulationia.CritterInfo.Initialize(Critter.java:35)at   simulationia.SimulationIA.main(SimulationIA.java:21)

第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。也许这是不可行的。

编辑:我认为这可能与我不使用实际对象,只有枚举的值因此抱怨空指针的事实有关。是对的吗 ?我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:5)

您永远不会创建地图,因此put会调用null

你应该做(例如):

static private Map<Object, String> enum_desc = new HashMap<Object, String>();

答案 1 :(得分: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;
    }    

}

答案 2 :(得分: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

因此,我们知道enum将通过enum方法输出toString的“名称”。

这很有用,因为您可以使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
Java中的

enum是一种特殊类型的对象,您可能希望阅读Enum Types以获取更多信息