2014-03-26 121 views
1

我剛剛開始使用圖形,並試圖使用城市建立鄰接列表。這兩個城市被髮送到addRelation方法。我想說,如果已經沒有匹配第一個或最後一個字符串的頂點,請使用尚不存在的字符串創建一個新的頂點。現在我所得到的是一個空指針異常,與*一致。有沒有人對我做錯了什麼或者我應該做什麼有什麼想法?鄰接列表添加關係

public class AdjList { 

public class Node{ 
    int num; 
    Node next; 
    Node(int num, Node next){ 
     this.num=num; 
     this.next=next; 
    } 
} 

public class Vertex{ 
    String city; 
    Node list; 
    Vertex(String city, Node next){ 
     this.city=city; 
     this.list=next; 
    } 
} 

Vertex [] aList= new Vertex [50]; 

void addRelation(String from, String to) { 
    for(int i=0; i<aList.length; i++){ 
     ****if(!aList[i].city.equals(from)){**** 
      aList[i]=new Vertex(from, null); 
     }  
     if(aList[i].city.equals(from)){ 
      aList[i]=new Vertex(from, null); 
     } 
    } 
} 

主營:

public static void main(String args[]) { 
    AdjList g = new AdjList(); 
    g.addRelation("Atlanta", "Chattanooga"); 
    g.addRelation("Chattanooga", "Nashville"); 
    g.addRelation("Chattanooga", "Knoxville"); 
    g.addRelation("Atlanta", "Birmingham"); 
    g.addRelation("Greenville", "Knoxville"); 
} 
+0

'aList'數組現在充滿了空值。所以當你訪問'aList [i]'時,它會拋出NPE – Alejandro

+0

@AlejandroLucena,所以我必須首先檢查aList [i] == null? – user3277779

+0

好吧,是的,不。你可以這樣做,或者在調用'addRelation'之前循環並用虛擬'頂點'實例填充數組。 – Alejandro

回答

0

在代碼中你寫

Vertex [] aList= new Vertex [50]; 

該行只分配你足夠的空間,讓您潛在容納50個Vertex項目。然而,這並不意味着數組將在分配後立即被填充。所以你基本上有容量來存儲50 Vertex項目。

在你的方法addRelation它如果!aList[i].city.equals(from)檢查,但是aList陣列沒有任何實際Vertex對象,所以當你嘗試從aList[i]查詢city現場,你基本上是試圖查詢一個空的對象,因此,空指針異常。

對此有兩種解決方法。

  • 檢查在繼續循環之前空(如你在評論中所建議的)
  • 調用任何方法之前裝滿虛擬Vertex對象數組。

啞方法需要你來初始化或者爲空字符串/空參數對象的構造函數的參數,也可以實現默認的構造函數,只是說new Vertex()然後自定義Vertex對象的citynext領域在你的代碼邏輯中。

+0

這些選項之一是否比其他選項更好? – user3277779

+0

我想這將是具體實現,並且是一種編碼風格偏好。如果內存是一個大問題,那麼只有在需要的時候添加顯然是最佳選項(檢查循環內是否爲null)。 – Alejandro

+0

好的。所以除了檢查它是否爲空。我是否正確添加到鄰接矩陣? – user3277779