此功能应该在所选索引处添加一个元素,并将数组元素中的所有其他元素向下推。所以,例如,假设我有以下数组:
[0] = zero
[1] = one
[2] = two
如果我在索引0处添加另一个名为NEWZERO的元素,则数组必须如下所示:
[0] = NEWZERO
[1] = zero
[2] = one
[3] = two
但是目前我得到了IndexOutOfBounds异常并且它不起作用,尽管我的数组比3个元素大得多。
P.S。我不想使用内置的ArrayList库,它会自动为你做这件事。
public void insert(int i, String s) {
if (array[i] == null) {
array[i] = s; //Need to add feature that instantly puts the element at the first available spot on the list.
} else {
for (int j = i; j < array.length; j++) { //Can't use >= i
array[j + 1] = array[j]; //THIS IS WHERE I GET THE ERROR.
if (j == array.length - 1) {
break;
}
}
array[i] = s;
extendArray(); //If an element is inserted properly, the array becomes array.length + 1
我没有收到错误,因为我的数组中没有空格。即使我有一个包含20个元素的数组,并且我只使用了3个,我仍然会收到OutOfBounds错误。这是我的扩展数组方法,用于当用户用完数组空间时。
public void extendArray() {
String[] items2 = new String[items.length + 1];
for (int j = 0; j < items.length; j++) {
items2[j] = items[j];
}
items = items2;
}
答案 0 :(得分:3)
初始化数组时,它的存在范围为0到length-1。
代码
for (int j = i; j < array.length; j++) { //Can't use >= i
array[j + 1] = array[j]; //THIS IS WHERE I GET THE ERROR.
您正在尝试将值存储到超出数组范围的数组[length]。
所以将for更改为
for (int j = i; j < array.length - 1; j++) { //Can't use >= i
array[j + 1] = array[j];
答案 1 :(得分:1)
当j
在循环中到达array.length-1
时,array[j + 1]
超出范围。
要解决此问题,请更改停止条件(并删除break
,因为它完全没必要):
for (int j = i; j < array.length - 1; j++) {
array[j + 1] = array[j];
}
最后,您可能希望通过一次调用System.arraycopy()
来替换整个循环。
答案 2 :(得分:1)
当j到达最后时,j + 1将超出约束并导致arrayIndexoutOfBoundException
解决方案:
更改for循环,如下所示
for (int j = i; j < array.length - 1; j++) { //Can't use >= i
array[j + 1] = array[j];
}
答案 3 :(得分:1)
你已经在循环中有j
的条件,那你为什么需要第二个呢?只需使用
for (int j = i; j < array.length - 1; j++) { //Can't use >= i
array[j + 1] = array[j];
}
答案 4 :(得分:1)
尝试此修复
for (int j = i; j < array.length - 1; j++) { //Can't use >= i
array[j + 1] = array[j];
}
此外,在插入新元素之前扩展数组的大小是有意义的