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は stillnullなので、それがあなたの に入れられます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 に何かを割り当てても、そのままです)。

2 つのステートメントの順序を逆にします。

または、一般的に私は二重ブレース初期化子を承認しませんが (願わくば、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 に答える