2013-07-12 52 views
0
Map<String, String> listOfIndexes = INDEXED_TABLES.get(tableName); 
Iterator it = listOfIndexes.entrySet().iterator(); 
while (it.hasNext()) { 
    Map.Entry pairs = (Map.Entry)it.next(); 
    System.out.println(pairs.getKey()); 
} 

我的Hashmap是這樣的:爲什麼這個Hashmap Iteration不起作用?我得到一個空指針異常

public static Map<String, Map<String, String>> INDEXED_TABLES = new HashMap<String, Map<String, String>>() 
{{ 
    put("employee", EMPLOYEE); 
}}; 

public static Map<String, String> EMPLOYEE = new HashMap<String, String>() 
{{ 
    put("name", "Test"); 
    put("age", "Test"); 
    put("sex", "test"); 
}}; 
+1

異常的Javadoc列出所有可能的原因:但是,如果你把初始化代碼到一個單獨的初始化,而不是使用匿名類定製的初始化,你會更好http://docs.oracle.com/javase /7/docs/api/java/lang/NullPointerException.html – BalusC

+0

謝謝...但是,你有我的數據和電話。我一直試圖弄清楚這一點。 –

+0

如果您使用不存在的「表格名稱」,則會在第二行顯示NPE。 – Thilo

回答

2

看起來你是把員工到地圖已經初始化之前,所以這將是null(和繼續這樣做,甚至如果您稍後將某些內容分配給EMPLOYEE)。

顛倒兩個語句的順序。

或者,而在一般I disapprove of the double-brace-initializer(希望我們能得到的Java 8妥善收集文字):

public static Map<String, Map<String, String>> INDEXED_TABLES = 
    new HashMap<String, Map<String, String>>(){{ 
    put("employee", new HashMap<String, String>(){{ 
     put("name", "Test"); 
     put("age", "Test"); 
     put("sex", "test"); 
    }} 
}} 
+0

他們在不同的班級。第二個肯定是在調用之前實例化的。讓我看看這個。謝謝。 –

3

這是因爲你自己撲空:你的初始化取決於執行的順序。當時這條線運行

put("employee", EMPLOYEE); 

EMPLOYEE仍然null,所以這就是被放入你Map<String,Map<String,String>>

您可以切換初始化程序的順序來解決此問題。

public static Map<String, Map<String, String>> INDEXED_TABLES = new HashMap<String, Map<String, String>>(); 
public static Map<String, String> EMPLOYEE = new HashMap<String, String>(); 
static { 
    EMPLOYEE.put("name", "Test"); 
    EMPLOYEE.put("age", "Test"); 
    EMPLOYEE.put("sex", "test"); 
    INDEXED_TABLES.put("employee", EMPLOYEE); 
} 
+2

+1。而EMPLOYEE可能會成爲該靜態塊中的局部變量。 – Thilo

相關問題