2012-10-24 47 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 
    }