2017-12-18 174 views
-2

我有三個hashmaps,其中2個有多個值(arrayLists)。如果散列表內的arraylist爲空?

Map<String, String> advise = new HashMap<String, String>(); 
    Map<String, ArrayList<String>> teach = new HashMap<String,ArrayList<String>>(); 
    Map<String, ArrayList<String>> takesCo = new HashMap<String,ArrayList<String>>(); 
    //ArrayList<String> courses = new ArrayList<String>; 

我想基於第一的HashMap(提醒)的關鍵,在它們之間迭代 數組列表包含課程名稱和我想打印時,有一個匹配。

for (String x : advise.keySet()) { 
    String y = advise.get(x); 
    ArrayList<String> z1values = teach.get(y) ; 
    ArrayList<String> z2values = takesCo.get(x) ; 
    if (!z1values.isEmpty() && !z2values.isEmpty()){ 
    for (String z1:z1values){ 
     for (String z2:z2values){ 
      if (z1.equals(z2)){ 
       result=x+","+y+","+z1; 
       system.out.println(result); 
       } 
      } 
     } 
    } 
} 

我得到nullPointerException符合if語句

+0

你在你的IDE嘗試調試?生成的異常跟蹤會告訴你什麼是空的,可以做些什麼來避免這種情況。 – Nishant

+0

在第一個if語句中,您正在調用空對象(z1values.isEmpty())上的方法。在調用之前,您需要確保z1values不爲null,以確定列表是否爲空。 – Zachary

+0

「with ** the ** if語句」你在這段代碼中有兩個:對你的意思是特定的(例如「第一個if語句」);或者只是省略不相關的代碼。 –

回答

2

只要改變從

!z1values.isEmpty() && !z2values.isEmpty() 

您的條件

z1values != null && z2Values != null && !z1values.isEmpty() && !z2values.isEmpty() 
+0

精彩的回答,快速,正確! 之前我曾試過'z1values!= null && z2Values!= null'單獨 和'!z1values.isEmpty()&&!z2values.isEmpty()' 但無效。兩者有什麼區別? – zaranaid

+0

isEmpty()檢查數組列表的大小是否爲0 ..但是如果在列表爲null時調用此函數,它將拋出NullPointerException。這就是爲什麼在調用這個之前,你需要確保列表不爲空。 –

+0

另一種方法(至少在使用Java 8+時,假設你不是故意插入空值)是使用'teach.getOrDefault(y,Collections.emptyList())':然後你得到一個空列表而不是null,所以空檢查是不必要的。再次檢查列表是否爲空也是不必要的,因爲無論如何您都不會爲空列表做任何事情。 –