Java返回Array Out of Bounds Exception

时间:2017-10-11 16:32:15

标签: java arrays

我有一些代码将数组中的整数与给定值进行比较,并创建一个新数组,其值仅高于给定值。这是我的代码:

import java.util.Arrays;

class ex6{
public static void main(String[] args){
    int[] a = {12, 13, 14};
    filter(a, 15);
}

public static int[] filter(int[] a, int b){
    int[] newArray = {};
    for(int i = 0; i < a.length; i++){
        if(a[i] < b){
            newArray[i] = a[i];
        }
    }
    System.out.println(Arrays.toString(newArray));
    return newArray;
    }
}

但是,当我尝试运行我的代码时,它返回一个Array Out Of Bounds Exception,我无法弄清楚原因。循环只运行数组的长度,所以这不应该发生这种情况。

5 个答案:

答案 0 :(得分:4)

那是因为你的新数组是空的。

int[] newArray = {};

尝试将其设置为等于数组a

的大小
int[] newArray = new int[a.length];

答案 1 :(得分:0)

newArray的长度为0,因此只要a非空,newArray[i]就会导致您看到的异常。

也许您真正想要的是以下内容:

public static int[] filter(int[] a, int b){
    return Arrays.stream(a)
        .filter(elem -> elem < b)
        .toArray();
}

这与用户3437460的答案不同,该结果是一个数组只包含符合条件的元素,而user3437460的结果是一个与原始数据大小相同的数组,但所有元素都是低于阈值的人被0取代。哪一个是正确的取决于你没有指出的要求。

答案 2 :(得分:0)

您正在创建一个newArray,其中包含0个元素,然后您尝试在其分配的元素位置之外设置其中的元素。

您必须事先了解阵列大小才能分配正确的数量。您可以使用newArray = new int[a.length]来构建代码的方式。在这种情况下,这将起作用,因为如果您的过滤条件匹配,则将值指定为与原始数组newArray[i] = a[i]中完全相同的索引。跳过的值将保留为您可能想要或不想要的值&#39; 0&#39;

这可能是你想要的,但是一般程序员在他们的程序中不使用数组,他们使用集合库中的不同类,例如列表和集合。在现代编程中,不可能有一系列的int。

从Java 8开始,这种问题最好通过流来解决,过滤所需元素并将它们收集到列表中,或者可能收集到数组中。如果是原始的int可能是一个集合:

public static int[] filter(int[] a, int b) { 
    return Arrays.stream(a)  // creates an IntStream
           .filter(v -> v < b) // filter in the elements where the v < b
           .toArray(); // collect them into an array
}

我想重复一下我的警告:如果你需要这种类型的代码,那么可能以错误的方式设计它。非常可能

如果你真的,真的,真的想通过一个数组来做,并想要返回一个缩小的数组,你需要分配一个所需大小最大的数组(a.length),保持插入位置的索引在newArray中,最后创建另一个包含过滤条目数量的数组,然后使用System.arraycopy()将这些元素复制到数组中。

答案 3 :(得分:0)

您正在将newArray初始化为空的:

int[] newArray = {};

然后你试图在索引 i 分配一个值,而数组没有元素:

newArray[i] = a[i];

您应该使用适当的大小初始化数组,以便能够为其元素分配/读取值。默认情况下,这可能是参数a数组长度,但可以根据您的需要进行优化:

class ex6 {

    public static void main(String[] args){
        int[] a = {12, 13, 14};
        filter(a, 15);
    }

    public static int[] filter(int[] a, int b){
        int[] newArray = new int[a.length];
        for(int i = 0; i < a.length; i++){
            if(a[i] < b){
                newArray[i] = a[i];
            }
        }
        System.out.println(Arrays.toString(newArray));
        return newArray;
    }
}

答案 4 :(得分:0)

首先,你说新数组必须包含大于给定值的值,而不是更少,但你正在反过来。

而不是

if(a[i] < b)

这将会到来:

if(a[i] > b)  

另外,如果你在这里使用ArrayList,它可以帮助你减少占用的空间,就像创建一个数组一样,你必须初始化数组大小。

因此,您的算法将如下所示:

public static void main(String[] args){
    int[] a = {12, 13, 14,16};
    filter(a, 15);
}

public static ArrayList<Integer> filter(int[] a, int b){
    ArrayList<Integer> newArray = new ArrayList<>(); //dynamically increases as per the requirement
    for(int i = 0; i < a.length; i++){
        if(a[i] > b){   // Higher values, not lower
            newArray.add(a[i]);
        }
    }
    System.out.println(Arrays.toString(newArray.toArray()));
    return newArray;
}