我正在创建一个删除Integer数组中特定位置的元素的类。它在前两次完美运行,但由于某种原因,它决定抛出ArrayIndexOutOfBoundsException。
我的代码:
public class Arraydeletion {
public static int[] delete (int[] a, int delValPos){
int[] newArray = new int[a.length-1];
for (int i = 0; i < newArray.length; i++) {
if(a[i]!=a[delValPos]){ //<--- ArrayIndexOutOfBoundsException points here
newArray[i] = a[i];
}
else if(a[i] == a[delValPos]){
newArray[i] = a[delValPos+=1];
}
}
return newArray;
}
}
答案 0 :(得分:0)
您永远不会检查delValPos
是否是输入数组a
中的有效索引。您的方法必须在执行任何其他操作之前对其进行验证,如果提供了无效的delValPos
,则抛出异常。
工作代码如下所示:
public class Arraydeletion {
public static int[] delete (int[] a, int delValPos){
if (delValPos < 0 || delValPos >= a.length)
throw new SomeException(); // TODO decide which exception to throw
int[] newArray = new int[a.length-1];
int index = 0;
for (int i = 0; i < a.length; i++) {
if (i!=delValPos) {
newArray[index] = a[i];
index++;
}
}
return newArray;
}
}
这使代码更简单。它将除a[delValPos]
之外的所有元素复制到输出数组。请注意,您不能使用相同的索引i
来读取输入数组中的元素并将元素写入输出数组,因为在传递已删除的元素后,每个i
&#39;输入数组中的第th个元素将被写入输出数组中的第(i-1)个位置。
答案 1 :(得分:0)
我测试了你的代码,只有当delValPos == a.length时才检索outOfBoundException,所以你可以在循环之前检查它。
但是你的代码很奇怪,似乎你想克隆一个数组,除了某个位置的一个元素,如果有的话,这样会更好:
public static int[] delete (int[] a, int delValPos){
int delValPos = 0;
int[] a = {1,2,3,4,5,6,7,8,9};
int[] newA = new int[a.length - 1];
if(a.length > delValPos) {
for(int i = 0 ; i < newA.length ; i++) {
if(delValPos < i && delValPos != 0) {
newA[i] = a[i];
}
else
newA[i] = a[i + 1];
}
}
return newA;
}