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