2016-04-03 46 views
-1

我正在生成一个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)); 

    } 
+4

请加堆栈跟踪:

如果必须使用数组,然后分配的evenNumbers和oddNumbers阵列后的代码的最后部分改变。但是,您正在运行循环以将偶数/奇数插入它们的数组中作为'i KevinO

+3

编译器不能抱怨,如果它的例外 – Sanj

+0

这甚至不会编译:for(i = 0; i <数字.length;我++){ – pczeus

回答

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 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]; 
    } 
} 
+0

这是一个不错的解决方案@KevinO。但是这是一个学校任务,我不应该使用ArrayList :) – Emil

+0

@Emil,增加了一个数组唯一的方法。 – KevinO

+0

哇@KevinO。这实际上正是我想要的方式。辉煌 - 谢谢! – Emil

0

的问题是:

oddNumbers[i]=numbers[i]; 

因为:当使用索引i访问元件阵列numberoddNumbers元件的数量是不一样的numbers

,您不小心尝试访问导致ArrayIndexOutOfBoundoddNumber中的i^th元素。

修复:至少,确保指数i< oddNumber.lengthi< numbers.length

例如

for(i=0; i <numbers .length && i<oddNumbers.length; i++){ 
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 & 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]); 
        } 
    } 
    
相关问题