具有ArrayList数组的Java Null Pointer Exception

时间:2012-10-24 18:58:41

标签: 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
        }

4 个答案:

答案 0 :(得分:3)

首先,您需要初始化数组的每个元素。因为在执行此操作之前,数组中的引用不指向任何对象。

因此,在for循环之前,您可以添加此循环,以初始化List中的Array: -

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的一个好处是,您不必在开头限制您的尺寸。因此,您可以添加任意数量的元素。但是,如果需要创建固定大小的列表,则可以在ArrayList构造函数中传递size参数。

然后您需要更改添加代码的元素: -

adj[v].add(u);

来: -

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

答案 1 :(得分:2)

那是因为你没有分配adj[v]。您无法在add上调用null方法。

你可以做到

   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); 
    }

答案 2 :(得分:1)

您确实创建了一个数组,但是您没有分配数组的每个元素。因此,当您尝试添加到不存在的元素时,会遇到NullPointerException。

作为旁注,如果您创建列表列表,那么您想要实现的目标会更好。换句话说:

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

然后,您可以在 yourList 中初始化每个单独的列表,然后将元素放入其中。

答案 3 :(得分:0)

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

adj是对1000 ArrayList个引用的引用。您还需要初始化每个ArrayList

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
    }