循环运行2次,然后Array索引超出范围异常

时间:2014-09-30 12:45:17

标签: java arrays for-loop integer indexoutofboundsexception

我正在创建一个删除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;
    }
}

2 个答案:

答案 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;
}