2017-03-16 109 views
-1

以下代碼中的語句if (!adjacentNodes.get(nodeId).isEmpty())有什麼問題?檢查散列表是否包含項目?

這種說法導致了以下消息:

顯示java.lang.NullPointerException

package IN.company; 

import java.util.HashMap; 
import java.util.HashSet; 

public class DiffusionModels { 
    public int ICModel(int[] seedSet, HashMap<Integer, HashSet<Integer>> adjacentNodes, double p) { 
     HashSet<Integer> infected = new HashSet(); 
     HashSet<Integer> recentlyInfected = new HashSet(); 
... 

     while (recentlyInfected.size() > 0) { 
      HashSet<Integer> nextActivator = new HashSet<>(); 
      if (!recentlyInfected.isEmpty()) { 
       for (Integer nodeId : recentlyInfected) { 
         if (!adjacentNodes.get(nodeId).isEmpty()) { 
          HashSet<Integer> neighborsOfNode =adjacentNodes.get(nodeId) ; 
          for (Integer nodeNeighbor : neighborsOfNode) { 
           if ((Math.random() <= p)&& !(infected.contains(nodeNeighbor))) { 
            nextActivator.add(nodeNeighbor); 
           } 
          } 
         } 
       } 
      } 
      infected.addAll(recentlyInfected); 
      recentlyInfected.clear(); 
      recentlyInfected.addAll(nextActivator); 
     } 
     return infected.size(); 
    } 
} 
+0

如果您指定的表達式生成'NullPointerException'那麼肯定是因爲'adjacentNodes.get( nodeId)'返回'null'。特別要注意,'null'是一個完全不同的野獸,從非空引用到一個空的'Map'。 –

+0

謝謝,但我該如何解決它?我用isEmpty函數檢查這個問題,這是錯誤的嗎? – JavaDev

+0

@Timothy Truckle,謝謝,但那個話題對我來說不會有用。 – JavaDev

回答

1

這東陽adjacentNodes爲空,導致以NPE.Before該行嘗試打印相鄰節點的值。希望這有助於。

+0

謝謝,我知道,但我該如何解決它? – JavaDev

+0

!adjacentNodes.isEmpty()或!= null –

1

試試這個if (adjacentNodes.get(nodeId) != null && !adjacentNodes.get(nodeId).isEmpty()) {

0

我將不勝感激,如果有人幫我解釋一下這是什麼說法的問題:

if (!adjacentNodes.get(nodeId).isEmpty()) 

這種說法導致「顯示java.lang.NullPointerException」

根據您發佈的代碼或者adjacentNodesnull或它不包含當前由nodeId引用的密鑰。

您必須檢查adjacentNodes不是null在該行之前。

如果adjacentNodes不是你應該使用Java8的Map類的getOrDefault()方法(https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#getOrDefault-java.lang.Object-V-

if(!adjacentNodes.getOrDefault(nodeId, Collections.emptySet()).isEmpty())){ //...