我在这里发现了许多相关帖子,但无法得到我的答案。为什么会出现这个运行时错误?
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 :(得分: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
}