我目前正在尝试将项目添加到arraylists的通用“数组”中,但由于某种原因,我不断获得空指针异常。初始化结构,我的数组索引引用和我传入的对象的引用都在异常发生之前的代码体内可见。我几乎肯定它的方式我要么声明数据结构,要么我试图添加它的方式。任何建议将不胜感激。提前致谢
ArrayList<Site>[] group = (ArrayList<Site>[])new ArrayList[entranceSites.size()];
group[i].add(sIndex(path));
sIndex
是我用来将整数转换为图形网站的函数,当我传递它时对象不为null所以我确定它不是问题。我已初始化并且对程序也可见。
答案 0 :(得分:4)
new ArrayList[entranceSites.size()];
实际上并没有使用任何构造函数初始化数组元素。该数组将填充enteranceSites.size()
个null元素。
您需要遍历数组并实际构造ArrayList
个对象。
答案 1 :(得分:3)
以下是如何使用Java 8将数组的每个元素设置为新的ArrayList
:
Arrays.setAll(group, n -> new ArrayList<Site>());
(第二个参数是n
的函数,即数组索引,但n
实际上并未使用。您仍然需要包含它。)
答案 2 :(得分:2)
您已经分配了一个ArrayList
的数组,但是您没有在该数组中分配任何实际的ArrayList
。该数组最初包含所有null
引用。因此,您对add
的调用位于null
引用上,从而导致异常。如果你说:
group[i] = new ArrayList<Site>();
在致电add
之前,它会起作用。
请注意,混合原始数组和Java集合通常是一个坏主意,如果您不熟悉Java,那么您应该坚持使用集合,因为它们将更容易使用。
你还应该知道你正在制作(ArrayList<Site>[])
的演员表并且几乎肯定会发出警告,假设你已经启用了警告,你应该作为初学者启用警告 。这是将泛型与原始数组混合不是一个好主意的另一个原因。
答案 3 :(得分:1)
根据您的代码片段的外观,我的猜测是您无法初始化添加到数组中的ArrayList<Site>
元素;因此,在调用List.add()
方法时失败。数组本身已正确初始化,但您尝试将Site添加到尚未正确初始化的ArrayList。
要使其正常工作,您必须创建ArrayList<Site>
对象。正确实例化列表后,可以将它们添加到阵列中。您可以在创建列表时或在将它们添加到阵列后添加Site
个对象。什么时候因为内存空间已经分配了。假设一家公司在许多州拥有网站,为了争论,纽约。该地理位置的所有站点都将添加到纽约站点列表中:
ArrayList<Site> nySites = new ArrayList<Site>();
Site site1 = new Site();
group[0] = nySites;
group[0].add(site1); // Now you can call the add() method
我希望这会有所帮助。