-2

我在这里找到了很多相关的帖子,但无法得到我的答案。为什么会出现这个运行时错误?

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

4 回答 4

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

使用 an 的一个优点ArrayList是,您不必在一开始就限制您的大小。因此,您可以添加任意数量的元素。但是,如果需要创建固定大小的列表,您可以在ArrayList构造函数中传递 size 参数。

然后你需要改变你的元素添加代码: -

adj[v].add(u);

到: -

adj.get(v).add(u);
于 2012-10-24T18:59:52.607 回答
2

那是因为你不分配adj[v]. 您不能addnull.

你可以做

   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); 
    }
于 2012-10-24T18:59:31.813 回答
1

您已经确定创建了一个数组,但尚未分配数组的每个元素。因此,当您尝试添加到不存在的元素时,您会遇到 NullPointerException。

作为旁注,如果您创建一个列表列表,您想要实现的目标看起来会好得多。换句话说:

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

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

于 2012-10-24T19:03:52.847 回答
0
List<Integer>[] adj = (List<Integer>[]) new ArrayList[1000];

adj是对 1000 个引用的ArrayList引用。您还需要初始化这些ArrayLists 中的每一个。

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
    }
于 2012-10-24T19:09:08.877 回答