0

这是我正在尝试做的事情以及我遇到的问题:我想“伪造”通往动态数组的方式。这意味着,使用普通的数组结构,只要它满了,我就会创建一个比旧数组大 25% 的新数组,然后将旧数组的元素复制到新数组中。

// Whenever my original nodes array is full
Node aNew[];
aNew = new Node[newDesiredSize];
//I create every new element in the new array for this to be a deep copy
for (int i=0; i<numVert; i++){
     aNew[i] = new Node(nodes[i].getId());
}
nodes = aNew;

但这似乎不起作用,因为当我尝试填充和访问新创建的数组时,出现NullPointerException错误。

我一直在与这种伪造动态数组的方法作斗争,但我显然遗漏了一些东西。

ArrayList不允许使用或任何其他形式的真正动态结构。

/ * ** /

编辑:根据建议,我改变了

aNew[i] = new Node(nodes[i].getId());

aNew[i] = nodes[i];

但这似乎并不能解决问题。

我还检查了所有 i 的空位置,结果证明我有。该程序似乎正在“失去”整个新成长的部分。

/ * /

解决了!这是在增长时添加新元素的问题。现在一切都好。谢谢你的帮助。将发布更多信息以供将来参考。

4

2 回答 2

2

看起来 NPE 是由 getId 调用引起的。

但是为什么要创建一个新节点呢?只是:

aNew[i] = nodes[i];

您的新数组应该包含与旧数组相同的对象,而不是它们的克隆。

另外,一旦一切正常,作为优化,请考虑System.arrayCopy消除对循环的需求。

于 2012-10-10T12:46:27.250 回答
2

使用来源:-)java.util.ArrayList这样做。参见例如grow()方法

于 2012-10-10T12:50:23.390 回答