Java 为什么这个Hashmap迭代不起作用?我得到一个空指针异常 Map listofIndex=index_TABLES.get(tableName); 迭代器it=ListofIndex.entrySet().Iterator(); 而(it.hasNext()){ Map.Entry pairs=(Map.Entry)it.next(); System.out.println(pairs.getKey()); }

Java 为什么这个Hashmap迭代不起作用?我得到一个空指针异常 Map listofIndex=index_TABLES.get(tableName); 迭代器it=ListofIndex.entrySet().Iterator(); 而(it.hasNext()){ Map.Entry pairs=(Map.Entry)it.next(); System.out.println(pairs.getKey()); },java,collections,nullpointerexception,iterator,hashmap,Java,Collections,Nullpointerexception,Iterator,Hashmap,我的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如下所示:

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());
}
publicstaticmap索引_TABLES=newhashmap()
{{
put(“雇员”,雇员);
}};
公共静态映射EMPLOYEE=newhashmap()
{{
放置(“名称”、“测试”);
put(“年龄”、“测试”);
put(“性别”、“测试”);
}};

看起来您是在初始化EMPLOYEE之前将其放入映射中,因此它将为
null
(即使您稍后将某些内容分配给EMPLOYEE,也将保持此状态)

颠倒两个语句的顺序

或者,在一般情况下(希望我们能在Java8中获得适当的集合文本):

公共静态映射索引\u表=
新HashMap(){{
put(“employee”,新HashMap(){{
放置(“名称”、“测试”);
put(“年龄”、“测试”);
put(“性别”、“测试”);
}}
}}

看起来您是在初始化EMPLOYEE之前将其放入映射中,因此它将为
null
(即使您稍后将某些内容分配给EMPLOYEE,也将保持此状态)

颠倒两个语句的顺序

或者,在一般情况下(希望我们能在Java8中获得适当的集合文本):

公共静态映射索引\u表=
新HashMap(){{
put(“employee”,新HashMap(){{
放置(“名称”、“测试”);
put(“年龄”、“测试”);
put(“性别”、“测试”);
}}
}}

这是因为您比自己聪明:您的初始值设定项取决于执行顺序。在此行运行时

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");
   }}
}}
EMPLOYEE
仍然是
null
,因此这就是放入
映射中的内容

您可以切换初始值设定项的顺序以解决此问题。但是,如果将初始化代码放入单独的初始值设定项中,而不是将匿名类与自定义初始值设定项一起使用,则效果会更好:

put("employee",  EMPLOYEE);
publicstaticmap index_TABLES=newhashmap();
public static Map EMPLOYEE=new HashMap();
静止的{
员工姓名(“姓名”、“测试”);
雇员。put(“年龄”、“测试”);
员工。put(“性别”、“测试”);
索引的_表。put(“雇员”,雇员);
}

这是因为您比自己聪明:您的初始值设定项取决于执行顺序。在此行运行时

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");
   }}
}}
EMPLOYEE
仍然是
null
,因此这就是放入
映射中的内容

您可以切换初始值设定项的顺序以解决此问题。但是,如果将初始化代码放入单独的初始值设定项中,而不是将匿名类与自定义初始值设定项一起使用,则效果会更好:

put("employee",  EMPLOYEE);
publicstaticmap index_TABLES=newhashmap();
public static Map EMPLOYEE=new HashMap();
静止的{
员工姓名(“姓名”、“测试”);
雇员。put(“年龄”、“测试”);
员工。put(“性别”、“测试”);
索引的_表。put(“雇员”,雇员);
}

exception的javadoc列出了所有可能的原因:谢谢……但是,你有我的数据和电话。我一直在想这个问题。如果你使用“tablename”这是不存在的,你会在第二行得到一个NPE。哈哈…哦,是的,我应该有。异常的javadoc列出了所有可能的原因:谢谢…但是,你有我的数据和电话。我一直在想这个问题。如果你使用“表名”那是不存在的,你会在第二行得到一个NPE。哈哈…哦,是的,我应该有。他们在不同的类中。第二个肯定是在呼叫之前实例化的。让我看看这个。谢谢。他们在不同的类中。第二个肯定是在呼叫之前实例化的。让我看看这个。谢谢.1。EMPLOYEE可能会成为该静态块中的局部变量。+1。EMPLOYEE可能会成为该静态块中的局部变量。