Java返回数组越界异常

Java返回数组越界异常,java,arrays,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 = {}; fo

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

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;
    }
}
导入java.util.array;
ex6类{
公共静态void main(字符串[]args){
int[]a={12,13,14};
过滤器(a,15);
}
公共静态int[]筛选器(int[]a,int[]b){
int[]newArray={};
for(int i=0;i

然而,当我试图运行代码时,它返回一个数组越界异常,我不知道为什么。循环只在数组的长度上运行,因此不应该发生这种情况

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

也许你真正想要的是:

public static int[] filter(int[] a, int b){
    return Arrays.stream(a)
        .filter(elem -> elem < b)
        .toArray();
}
公共静态int[]过滤器(int[]a,int[]b){
返回数组.stream(a)
.过滤器(元素->元素

这与user3437460的回答不同,它的结果是一个仅包含符合条件的元素的数组,而user3437460的结果是一个与原始数组大小相同的数组,但所有低于阈值的元素都被替换为
0
。哪一个是正确的取决于您没有指出的要求。

这是因为您的新阵列是空的

int[] newArray = {};
尝试将其设置为数组
a
的大小:

int[] newArray = new int[a.length];

您正在创建一个
newArray
,其中正好有0个元素,然后尝试将其中的元素设置在分配的元素槽之外

为了分配正确的数量,您必须预先知道数组大小。按照您构建代码的方式,您可以使用
newArray=newint[a.length]
来实现这一点。在本例中,这是可行的,因为如果筛选条件匹配,则在与原始数组中完全相同的索引处分配值
newArray[i]=a[i]
。跳过的值将保持值“0”,这可能是您想要的,也可能是您不想要的

这可能是您想要的,但通常程序员在程序中不使用数组,而是使用集合库中的不同类,例如列表和集合。在现代编程中,不太可能有整数数组

由于Java8,这类问题最好通过流来解决,在需要的元素中进行过滤,然后将它们收集到一个列表中,或者可能收集到一个数组中。对于基本整数,可能是一个集合:

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
}
公共静态int[]过滤器(int[]a,int[]b){
return array.stream(a)//创建一个IntStream
.filter(v->v
我想重复我的警告,如果你需要这种类型的代码,你可能是设计错误的方式。很可能


如果您真的、真的、真的希望通过数组执行此操作,并且希望返回缩小的数组,则需要分配一个具有所需最大大小(a.length)的数组,并在
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;
    }
}
类ex6{
公共静态void main(字符串[]args){
int[]a={12,13,14};
过滤器(a,15);
}
公共静态int[]筛选器(int[]a,int[]b){
int[]newArray=newint[a.length];
for(int i=0;i
首先,您说过新数组必须包含大于给定值且不小于给定值的值,但您的做法正好相反

而不是

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;
}
publicstaticvoidmain(字符串[]args){
int[]a={12,13,14,16};
过滤器(a,15);
}
公共静态ArrayList筛选器(int[]a,int b){
ArrayList newArray=newArrayList();//根据需要动态增加
for(int i=0;ib){//更高的值,而不是更低的值
新增(a[i]);
}
}
System.out.println(Arrays.toString(newArray.toArray());
返回新数组;
}

可以使用调试器检查数组的大小
newArray
。提示:Java数组的大小是固定的。您不能向空数组中添加元素。“创建一个值高于给定值的新数组”那么为什么您的代码试图将低于
b
的值分配给新数组?取决于未提及的要求。@Lothar它是通过OP的代码“提及”的。方法筛选器返回元素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; }