Java 当原始数组小于新数组的固定长度时,如何避免这种边界外错误?

Java 当原始数组小于新数组的固定长度时,如何避免这种边界外错误?,java,eclipse,Java,Eclipse,对于我正在处理的这项任务,我初始化了两个数组: private int[] numbers; numbers = new int[] {2, 3, 1, 4, 7, 6, 5, 2} private int[] newNumbers = new int[8]; 这样做的结果是,我有一个For循环,它将原始数字数组中的数字分配到newNumbers数组中 数字数组的长度可以不同,最多24个数字,最少1个数字 我已经编写了将数字(无论数字数组的长度如何)划分为newNumbers数组的代码,new

对于我正在处理的这项任务,我初始化了两个数组:

private int[] numbers;
numbers = new int[] {2, 3, 1, 4, 7, 6, 5, 2}
private int[] newNumbers = new int[8];
这样做的结果是,我有一个For循环,它将原始数字数组中的数字分配到newNumbers数组中

数字数组的长度可以不同,最多24个数字,最少1个数字

我已经编写了将数字(无论数字数组的长度如何)划分为newNumbers数组的代码,newNumbers数组的固定长度始终为8

当有8个或更多的数字时,我可以用它来除数,但是当我使用for循环尝试除数时,当数字小于8时,我会得到一个越界错误

我使用的For循环(对于前8个数字,接下来的8个数字和之后的8个数字使用它们自己的循环)是:

for(int i=0;i
它可以根据需要工作,除了当少于8个数字时,我将得到一个OutOfBounds数组。我不确定这是否是因为第二个数组的固定长度为8,但我认为这里更有经验的Java程序员能够提供一些建议

ArrayIndexOutOfBoundsException
表示数组已被删除 使用非法索引访问

在您的例子中,数组
numbers
由大于其长度的索引访问

正如在注释中提到的,您只需要检查索引
i
是否不会溢出
numbers
数组。这就是你可以做到的:

int[] numbers = new int[] { 1, 2, 3, 4 };
int[] newNumbers = new int[8];

for (int i = 0; i < newNumbers.length; i++) {
    if (i < numbers.length) {
        newNumbers[i] = numbers[i];
    } else {
        newNumbers[i] = 0;
    }
}
System.out.println(Arrays.toString(newNumbers));

数组总是需要一个静态大小。如果数组的大小小于8,则始终需要用零填充数组

我建议您尝试在java中使用List

List<Integer> newNumbers = new ArrayList();
int maxSize = 8;
for(int i=0;i<numbers.length;i++){
     newNumbers.add(numbers[i]);
     if(newNumbers.size()==maxSize){
          break;
     }
}
List newNumbers=new ArrayList();
int maxSize=8;

对于(int i=0;i而言,一种解决方案是在数字数组长度上循环,而不是在newNumbers数组上循环,因为这将用0填充newNumbers数组的其余部分:

for(int i=0;i
另一个选项是使用arraycopy:

System.arraycopy(数字、0、新数字、0、短数字、长度);
这里0是每个数组的起始位置,其中数字是目标,数字是要复制的数组。
这比用Java手写的等效循环快得多。

如果少于8个数字,您希望发生什么?如果
numbers
数组小于8,它将抛出异常,因为(例如)索引7将不存在于
numbers
中。您将希望修改for循环,使其只升到
newNumbers
numbers
中的最小值(假设您只想使用该限制)也许您会这样保护?
this.newNumbers[i]=(i
Andreas的回答比我上面的评论更清晰——或者,如果可以的话,只能用min(number.length,8)初始化
newNumbers
[1, 2, 3, 4, 0, 0, 0, 0]
List<Integer> newNumbers = new ArrayList();
int maxSize = 8;
for(int i=0;i<numbers.length;i++){
     newNumbers.add(numbers[i]);
     if(newNumbers.size()==maxSize){
          break;
     }
}