为什么这个Hashmap迭代不起作用?我得到一个NullPointer异常

时间:2013-07-12 02:16:24

标签: java collections nullpointerexception iterator hashmap

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是这样的:

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");
}};

2 个答案:

答案 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);
}

答案 1 :(得分:2)

看起来您在将EMPLOYEE初始化之前将其放入地图中,因此它将为null(即使您稍后将某些内容分配给EMPLOYEE,也会如此)。

颠倒两个陈述的顺序。

或者,通常I disapprove of the double-brace-initializer(希望我们在Java 8中获得适当的Collection文字):

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");
   }}
}}