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

我的哈希图是这样的:

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

2 回答 2

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);
}
于 2013-07-12T02:26:23.147 回答
2

看起来您在初始化之前将 EMPLOYEE 放入映射中,所以它会null(并且仍然如此,即使您稍后为 EMPLOYEE 分配了一些东西)。

颠倒两个语句的顺序。

或者,虽然我一般不赞成双大括号初始化器(希望我们能在 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");
   }}
}}
于 2013-07-12T02:26:09.360 回答