Java - ArrayIndexOutOfBoundsException

时间:2016-04-03 23:26:26

标签: java arrays runtime-error

我正在研究一个生成随机数的java程序,然后将它们放在一个数组中。然后程序应该通过数组,将偶数和奇数放在两个新数组中,并将它们呈现给用户。该程序还告诉用户数组中有多少奇数和偶数。

我得到" 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));   

    }

3 个答案:

答案 0 :(得分:0)

问题是:

oddNumbers[i]=numbers[i];

因为:oddNumbers中的元素数量与numbers

不同

当您使用索引i访问数组number中的元素时,您不小心尝试访问导致{i^th的{​​{1}}元素1}}。

修复:至少确保索引oddNumberArrayIndexOutOfBound

例如

i< oddNumber.length

答案 1 :(得分:0)

问题陈述如下。根据生成的随机数,任何一个语句都将生成ArrayIndexOutBoundsException

evenNumbers[i]=numbers[i];
oddNumbers[i]=numbers[i];

以下是解决此问题的一些选项:

  1. 中为evenNumbers和oddNumbers维护单独的索引
        for(i=0; i < numbers.length; i++){
        if((numbers[i] % 2) == 0)
        {
            evenNumbers[eIndex++] = numbers[i];
        }
        else
        {
            oddNumbers[oIndex++] = numbers[i];
        }
    
    }
    
  2. List<Integer>用于oddNumbers&amp; 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]);
        }
    }
    

答案 2 :(得分:0)

多次运行循环确实不是一个好习惯。

我希望代码只能一次遍历随机数组。

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的大小中获取平均值/赔率总数,然后您可以将它们打印出来,重复它们等等。

当然,这种方法假设您实际上可以使用Java对象而不仅仅是数组。

如果必须使用数组,那么在将evenNumbers和oddNumbers数组分配到:

后,将代码的最后部分更改为
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];
  }
}