2014-04-28 41 views
-3
enum MyKeys { AKEY, BKEY, CKEY } 
Map <MyKeys, Clazz> zzz = new HashMap<MyKeys, Clazz>(); 
zzz.put(MyKeys.BKEY, new Clazz()); 
zzz.get(MyKeys.BKEY).setValues(someValues); 
Clazz xxx = zzz.get(MyKeys.BKEY);//returns null 

但是這個簡單的變化使得它返回正確的值:Java:不得不使用枚舉作爲HashMaps的鍵,爲什麼枚舉鍵HashMap.get()返回空指針?

enum MyKeys { AKEY, BKEY, CKEY } 
Map <String, Clazz> zzz = new HashMap<String, Clazz>(); 
zzz.put(MyKeys.BKEY, new Clazz()); 
zzz.get(MyKeys.BKEY).setValues(someValues); 
Clazz xxx = zzz.get(MyKeys.BKEY.toString());//doesn't returns null 

爲什麼?

+0

你怎麼填滿第一個hashmap?還有enummap以及btw – NimChimpsky

+1

您是否在使用它之前將BKEY定義爲enum?否則,您必須將其用作「MyKeys.BKEY」而不是「BKEY」。所以'zzz.put(MyKeys.BKEY,「bla」)''和'zzz.get(MyKeys.BKEY)' – Omoro

+2

提供一個完整的程序來重現問題。枚舉和HashMaps中的鍵很好,而你沒有顯示的是問題出在哪裏。 –

回答

1

如果使用

String xxx = zzz.get(MyKeys.BKEY); 

所以你實際上需要在方法參數使用它之前宣佈BKEY作爲MyKeys的枚舉,你會得到正確的值。

+0

在示例代碼中你可以看到BKEY被聲明,一個dit wouldn; t返回null這將是一個編譯器錯誤 – NimChimpsky

+0

剛剛編輯.. –

3
Map <MyKeys, Clazz> zzz = new HashMap<MyKeys, String>(); 
// this means it won't return null, the value is initialized 
zzz.put(MyKeys.BKEY, new Clazz()); 
// this is confusing part ... somevalues might be null 
zzz.get(MyKeys.BKEY).setValues(someValues); 
Clazz xxx = zzz.get(MyKeys.BKEY); //definitely won't return null 

你確定它的hashmap返回null,而不是放入hashmap的clazz的getValues()的結果。

你有一個錯誤在其他地方,請嘗試以下的web based compiler

import java.util.HashMap; 
import java.util.Map; 

public class HelloWorld{ 
    public static class Clazz { 
     public String val; 
     public void setValues(String someValues){ 
      val=someValues; 
     } 

    } 
    public enum MyKeys { AKEY, BKEY, CKEY; } 
    public static void main(String[] args){ 
     Map<MyKeys, Clazz> zzz = new HashMap<MyKeys, Clazz>(); 
     // this means it won't return null, the value is initialized 
     zzz.put(MyKeys.BKEY, new Clazz()); 
     // this is confusing part ... somevalues might be null 
     zzz.get(MyKeys.BKEY).setValues("someValues"); 
     Clazz xxx = zzz.get(MyKeys.BKEY); 
     System.out.println(xxx.val); 
    } 
} 
+0

謝謝你的回答。您的代碼與我在結構上使用的實際代碼完全相同。而且,「someValues」在我的程序中絕對不是空的。我調試了它。 1-手工查看zzz,BKEY分配有一些值。 2-出於好奇,我甚至在做zzz.get(MyKeys.BKEY)之前繼續前進,xxx = new Clazz(),xxx在「get」行之後立即變爲null。 3-只要將密鑰更改爲字符串,並使用MyKeys.BKEY.toString(),並且不觸及其他任何東西,它的工作就完美無瑕。所以,我相信這是一個枚舉問題。 – coffeenet

+0

儘管如此,zzz的定義和實例化在一個包內,而zzz.get(MyKeys.BKEY)代碼位於不同的包內。我在想,HashMap中的枚舉映射是通過使用從包到包而不是像BKEY文本這樣的常量值的枚舉地址來完成的。感謝您花時間閱讀這篇長篇評論。 – coffeenet

+0

@coffeenet看到更新 – NimChimpsky

1

我用Java的EnumMap

看看這個例子:

public enum Colors{ 
    BLUE, YELLOW, BROWN, RED; 
} 

然後開始你的EnumMap

// initialization 
EnumMap<Colors, String> stateMap = new EnumMap<Colors, String>(Colors.class); 

享受!