2013-04-30 45 views
0

的代碼塊列出如下子圖。但錯誤消息顯示「java.lang.NullPointerException」並顯示問題在於「subGraph [i] .nodeDelay = AdjList [i] .nodeDelay;」線。Java數組的NullPointerException

我通過打印到控制檯進行測試。並發現AdjList.length是8,問題發生在第一輪;甚至當我只寫「subGraph [i] .nodeDelay;」沒有分配任何值,它也顯示錯誤的信息。 對此有何想法?提前致謝。

+0

嘗試打印AdjList – 2013-04-30 08:46:35

回答

1

添加它的循環中:

subGraph[i] = new Vertex(); 

首先,您需要訪問它之前實例化一個對象(subGraph[i]你的情況)。

0

因爲subGraph[i]最初是null。所以subGraph[i].nodeDelay顯然會拋出一個NullPointerException,因爲你試圖來訪問或修改空對象的字段。默認情況下,引用數組將始終使用空引用元素進行初始化。

1

答案是:未初始化的變量。你做初始化子圖是一個數組,但你沒有初始化subGraph [i]。

0

當你在java中創建一個對象數組時,它會自動初始化爲空值。你有責任在數組上循環並使用新對象的引用來填充數組。 在你的情況下,你應該將Vertex對象分配給所有陣列位置。

0

您需要創建一個Vertex實例,並在設置任何字段之前將其放入數組中。

喜歡的東西:

public static Vertex[] computeSubGraph(Vertex[] AdjList, int[] retiming) 
{ 
    Vertex[] subGraph = new Vertex[AdjList.length]; 
    for (int i = 0; i < AdjList.length; i++) { 

     subGraph[i] = new Vertex(); // adding instance prior to setting fields. 

     System.out.println(i); 
     subGraph[i].nodeDelay = AdjList[i].nodeDelay; 
     subGraph[i].predecessor = AdjList[i].predecessor; 
     subGraph[i].mark = AdjList[i].mark; 
     subGraph[i].starTime = AdjList[i].starTime; 
     subGraph[i].finishTime = AdjList[i].finishTime; 
     for (int j = 0; j < AdjList[i].inArcList.size(); j++) { 
      ArcNode old = AdjList[i].inArcList.get(j); 
      ArcNode newNode = new ArcNode(old.adjVex, old.arcWeight); 
      subGraph[i].outArcList.add(newNode); 
      subGraph[old.adjVex].inArcList.add(newNode); 
     } 
    } 
    return subGraph; 
} 
0

在在馬託computeSubGraph的開頭添加

subGraph[i] = new Vertex(); 

此行之前

subGraph[i].nodeDelay = AdjList[i].nodeDelay;