在映射中使用枚举的NullPtrException Java

在映射中使用枚举的NullPtrException Java,java,Java,我正在尝试另一种方法来编写一些我已经有的代码,但我发现这些代码不合法,我遇到了这个例外。我真的不明白发生了什么,我对Java还是很陌生 如果代码有点多,我很抱歉,但我想我不能再多剪了。在Initialize()的第一行引发异常 以下是确切的错误消息: 线程“main”java.lang.NullPointerException中的异常位于 simulationia.criterInfo.Initialize(Critter.java:35)位于 simulationia.simulationia

我正在尝试另一种方法来编写一些我已经有的代码,但我发现这些代码不合法,我遇到了这个例外。我真的不明白发生了什么,我对Java还是很陌生

如果代码有点多,我很抱歉,但我想我不能再多剪了。在
Initialize()
的第一行引发异常

以下是确切的错误消息:

线程“main”java.lang.NullPointerException中的异常位于 simulationia.criterInfo.Initialize(Critter.java:35)位于 simulationia.simulationia.main(simulationia.java:21)

第35行是
Initialize()
的第一行。SimulationIA的第21行是对
Initialize()
的调用

基本上,我想做的是使用一个映射来保存所有枚举值,而不必考虑其类型,也不必检查
instanceof
。也许这是行不通的


编辑:我认为这可能是因为我不使用实际对象,只使用枚举的值,所以它抱怨空指针。是这样吗?我该如何处理这个问题呢?

您从未创建映射,因此
put
被调用为
null

您应该这样做(例如):

static private Map enum_desc=new HashMap();
根据您的评论,“我只想让文本描述与每个枚举值匹配”:

您可以利用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;
    }    

}

让我们从基础开始

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
将通过
toString
方法输出
enum
的“名称”

知道这一点很好,因为您可以使
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中是一种特殊类型的对象,坦率地说,您可能希望通读更多信息,这是一种糟糕的设计。如果你详细说明你想要完成什么,我们可以帮助你改进。当然。我没有比这更好的了。基本上,我只是希望能够有一个文本描述匹配到每个枚举值。这并不是我想做的事情中的一个真正的问题。我只是想学。愚蠢的错误!我还注意到我使用的是抽象类型而不是可实例化类型。@Alexandre使用抽象类型声明变量通常是个好主意。打勾可以解决我列出的问题(尽管我会从其他帖子中得到关于如何更恰当地实现目标的建议)。妙极了。我不知道。今天早些时候我读了那一页,但我觉得说实话并不是特别有用。谷歌在这一点上让我失望。因此,
public enum Planet
示例没有触发某些事件,因为这就是我们在这里演示的所有内容。我不习惯将enum用作类,所以我没有想过这样使用它。没必要这么胡闹。对不起,这不是一个把戏,更令人惊讶的是,如果我冒犯了,我道歉,
enums
仍然让我陷入:PNo担忧。一点点误会就这样!
CT_HERBIVORE
CT_CARNIVORE
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