0

我正在尝试另一种方法来处理我已经拥有的一些代码,但我发现这些代码并不优雅,并且遇到了这个异常。我真的不明白发生了什么,我对 Java 还是很陌生。

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

这是确切的错误消息:

在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. 也许这只是不可行。

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

4

3 回答 3

5

你永远不会创建地图,所以putnull.

您应该执行以下操作(例如):

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

所以我们知道 anenumenum通过它的toString方法输出“名称”。

很高兴知道这一点,因为您可以使您enum的 s 具有描述性。

如果这还不够好(不支持空格,或者您想要更友好的东西),您可以执行类似...

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

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

于 2012-10-08T01:20:02.133 回答