2012-10-24 90 views
-2

我在這裏發現了許多相關的帖子,但無法得到我的答案。爲什麼這個運行時錯誤?Array ArrayList的Java空指針異常

static List<Integer>[] adj = (List<Integer>[]) new ArrayList[1000]; 

    public static void main(String[] args) { 
     int edge, u, v, source; 
     Scanner input = new Scanner(System.in); 
     edge = input.nextInt(); 
     for (int i = 0; i < edge; i++) { 
      u = input.nextInt(); 
      v = input.nextInt(); 
      adj[v].add(u); // Null pointer Exception 
      adj[u].add(v); // Null pointer Exception 
     } 
+0

僅僅因爲您創建了數組,它並不意味着每個條目(每個'ArrayList')都被創建。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – madth3

回答

3

首先,你需要初始化數組中的每個元素。因爲在執行此操作之前,數組中的引用不指向任何對象。

所以,對於循環之前,你可以添加這一項,來初始化你ListArray: -

for (List<Integer> elem: adj) { 
    elem = new ArrayList<Integer>(); 
} 

此外,它會更好,如果你有List of List,而不是array of List。所以,你可以聲明您的列表如下: -

static List<List<Integer>> adj = new ArrayList<List<Integer>>(); 

使用ArrayList的一個優點是,你不必在一開始就限制了你的尺寸。所以,你可以添加任意數量的元素。但是,如果需要創建一個固定大小的列表,則可以在構造函數中傳遞大小參數。

然後你需要從改變你的元素添加代碼: -

adj[v].add(u); 

到: -

adj.get(v).add(u); 
+0

+1用於建議使用列表清單。我認爲這將是一條路。 – Sujay

+0

@Sujay。是的,使用列表的列表總是比二維數組或列表數組更好的選項。 :) –

+0

好的,使用'靜態列表<列表> adj = new ArrayList <列表>(100); '是一個不錯的主意。我曾嘗試過使用它,但無法弄清'adj [u] .add(v);'部分。那麼這個代碼會是什麼? –

2

這是因爲你沒有分配adj[v]。您不能撥打null上的add方法。

你可以做

for (int i = 0; i < edge; i++) { 
     u = input.nextInt(); 
     v = input.nextInt(); 
     if (adj[v]==null) adj[v] = new ArrayList(); 
     adj[v].add(u); 
     if (adj[u]==null) adj[u] = new ArrayList(); 
     adj[u].add(v); 
    } 
1

您已經創建了肯定的一個數組,但你還沒有分配的每個元素的陣列。因此,當您試圖添加到不存在的元素時,您會遇到NullPointerException。

作爲一個側面提示,如果您創建List列表,您嘗試實現的內容看起來會更好。換句話說:

List<List<Integer>> yourList = new ArrayList<List<Integer>>(); 

然後,您可以初始化每個單獨的列表內yourList然後把元素進去。

0
List<Integer>[] adj = (List<Integer>[]) new ArrayList[1000]; 

adj是1000所ArrayList引用的參考。您還需要初始化每個ArrayList s。

private final int MAX = 1000; 
static List<Integer>[] adj = (List<Integer>[]) new ArrayList[MAX]; 
public static void main(String[] args) { 
    for (int i = 0; i < MAX; i++){ 
     adj[i] = new ArrayList(); 
    } 

    int edge, u, v, source; 
    Scanner input = new Scanner(System.in); 
    edge = input.nextInt(); 


    for (int i = 0; i < edge; i++) { 
     u = input.nextInt(); 
     v = input.nextInt(); 
     adj[v].add(u); // Null pointer Exception 
     adj[u].add(v); // Null pointer Exception 
    }