Java - ArrayIndexOutOfBoundsException
问题描述:
我正在生成一个java程序,该程序生成随机数然后将它们放入数组中。然后程序应该通过数组,将偶数和奇数放入两个新数组中,并将它们呈现给用户。该程序还会告诉用户阵列中有多少个奇数和偶数。Java - ArrayIndexOutOfBoundsException
当试图编译这段代码时,我得到“ArrayIndexOutOfBoundsException”。 有人能告诉我为什么吗?
import java.util.Scanner;
import java.util.Random;
import java.util.Arrays;
class Randomnumbers
{
public static void main (String[] args)
{
Random random;
int i;
int numberOfNumbers=0;
int upperRange=999;
int lowerRange=0;
int randomNumber=0;
int even=0;
int odd=0;
int currentOdd=0;
int currentEven=0;
int[] oddNumbers=new int[0];
int[] evenNumbers=new int[0];
Scanner in = new Scanner(System.in);
System.out.println("Please enter how many random numbers you want(0-999)");
numberOfNumbers=in.nextInt();
int[] numbers=new int[numberOfNumbers];
random = new Random();
for (i = 0; i < numbers .length; i++){
randomNumber = random.nextInt(upperRange-lowerRange) + lowerRange;
numbers[i] = randomNumber;
}
System.out.println("\n" +"These are the random numbers:");
System.out.println(Arrays.toString(numbers));
for(i=0; i < numbers .length; i++){
if((numbers[i] % 2) == 0)
{
even = even + 1;
}
else
{
odd = odd + 1;
}
}
evenNumbers=new int[even];
oddNumbers=new int[odd];
for(i=0; i < numbers .length; i++){
if((numbers[i] % 2) == 0)
{
evenNumbers[i]=numbers[i];
}
else
{
// this is the code line the compiler does not like:
oddNumbers[i]=numbers[i];
}
}
System.out.println("The following " +even +" numbers are even:");
System.out.println(Arrays.toString(evenNumbers));
System.out.println("The following " +odd +" numbers are odd:");
System.out.println(Arrays.toString(oddNumbers));
}
答
这实在不是一个好的做法,通过循环多次运行。
我会代码只遍历随机数组一次。
List<Integer> evenNumbers = new ArrayList<>();
List<Integer> oddNumbers = new ArrayList<>();
for (i = 0; i < numbers.length; ++i) {
if (numbers[i] % 2 == 0) {
evenNumbers.add(numbers[i]);
}
else {
oddNumbers.add(numbers[i]);
}
}
您可以从各自的List
S的大小得到唇上/胜算的总数,并且可以打印出来,重复他们,等
当然,这种方法假定你可以实际上使用Java对象而不仅仅是数组。
int evenIdx = 0;
int oddIdx = 0;
for (i = 0; i < numbers.length; ++i) {
if (numbers[i] % 2 == 0) {
evenNumbers[evenIdx++] = numbers[i];
}
else {
oddNumbers[oddIdx++] = numbers[i];
}
}
答
的问题是:
oddNumbers[i]=numbers[i];
因为:当使用索引i
访问元件阵列number
在oddNumbers
元件的数量是不一样的numbers
,您不小心尝试访问导致ArrayIndexOutOfBound
的oddNumber
中的i^th
元素。
修复:至少,确保指数i< oddNumber.length
和i< numbers.length
例如
for(i=0; i <numbers .length && i<oddNumbers.length; i++){
答
问题陈述如下。取决于生成的任意一个随机数字将导致ArrayIndexOutBoundsException
。
evenNumbers[i]=numbers[i];
oddNumbers[i]=numbers[i];
这里有一些选项来解决此问题:
-
保持evenNumbers和oddNumbers单独的索引中
for(i=0; i < numbers.length; i++){ if((numbers[i] % 2) == 0) { evenNumbers[eIndex++] = numbers[i]; } else { oddNumbers[oIndex++] = numbers[i]; } }
-
使用
List<Integer>
为oddNumbers & evenNumbers。List<Integer> oddNumbers = new ArrayList<Integer>(); List<Integer> evenNumbers = new ArrayList<Integer>(); for(i=0; i < numbers.length; i++){ if((numbers[i] % 2) == 0) { evenNumbers.add(numbers[i]); } else{ oddNumbers.add(numbers[i]); } }
请加堆栈跟踪:
如果必须使用数组,然后分配的evenNumbers和oddNumbers阵列后的代码的最后部分改变。但是,您正在运行循环以将偶数/奇数插入它们的数组中作为'i
KevinO
编译器不能抱怨,如果它的例外 – Sanj
这甚至不会编译:for(i = 0; i pczeus