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