簡體   English   中英

NullPtrException Java在地圖中使用枚舉

[英]NullPtrException Java using enum in Map

我正在嘗試一種替代的方式來處理已有的一些代碼,這些代碼我覺得很模糊並且遇到了這個異常。 我不太了解發生了什么,對Java還是很陌生。

很抱歉,如果代碼太多,但我認為我不能削減更多。 Initialize()的第一行引發異常。

這是確切的錯誤消息:

Simulationia.SimulationIA.main(SimulationIA.java:21)的Simulationia.CritterInfo.Initialize(Critter.java:35)處的線程“ main”中的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進行檢查。 也許這是行不通的。

編輯:我認為這可能與以下事實有關:我不使用實際對象,僅使用枚舉的值,因此它抱怨空指針。 那正確嗎 ? 我將如何解決呢?

您永遠不會創建Map,因此對null調用put

您應該執行以下操作(例如):

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

根據您的評論,“我只希望能夠使文本描述與每個枚舉值匹配”:

您可以利用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的意志輸出的“名稱” 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以獲取更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM