2016-04-03 9 views
-1

Ich arbeite an einem Java-Programm, das Zufallszahlen generiert und dann in ein Array einfügt. Dann soll das Programm durch das Array gehen, die geraden und die ungeraden Zahlen in zwei neue Arrays schreiben und sie dem Benutzer präsentieren. Das Programm teilt dem Benutzer auch mit, wie viele ungerade und gerade Zahlen im Array vorhanden sind.Java - ArrayIndexOutOfBoundsException

Ich bekomme "ArrayIndexOutOfBoundsException" beim Versuch, diesen Code zu kompilieren. Kann mir jemand sagen warum?

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

Bitte fügen Sie den Stacktrace. Sie führen jedoch Ihre Schleife aus, um die geraden/ungeraden Zahlen in ihre Arrays als 'i KevinO

+3

Compiler kann nicht beschweren, wenn es eine Ausnahme ist – Sanj

+0

Das wird nicht einmal kompilieren: für (i = 0; i pczeus

Antwort

0

Es ist wirklich keine gute Praxis durch die Schleife mehrere Male ausführen.

Ich würde den Code nur ein einziges Mal das zufällige Array durchlaufen.

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

Sie können die Gesamtzahl der Evens/Odds von der Größe der jeweiligen List s, und Sie können sie ausdrucken, iterieren sie usw.

Natürlich nimmt dieser Ansatz Sie können tatsächlich verwenden Java-Objekte im Gegensatz zu nur Arrays.

Wenn Sie Arrays verwenden müssen, dann den letzten Teil des zu den evenNumbers nach der Zuteilung Code ändern und oddNumbers Arrays:

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

Das ist eine schöne Lösung @KevinO. Aber das ist eine Schulaufgabe und ich sollte ArrayList nicht verwenden :) – Emil

+0

@Emil, fügte einen Array-Ansatz hinzu. – KevinO

+0

Wow @KevinO. Das hat genau so funktioniert, wie ich es wollte. Brilliant - danke! – Emil

0

Das Problem ist:

oddNumbers[i]=numbers[i]; 

Denn: die Anzahl der Elemente in oddNumbers ist nicht das gleiche wie numbers

Wenn Sie den Index i verwenden Sie das Element in dem Array zuzugreifen number Versuchen Sie versehentlich auf das i^th Element in oddNumber zuzugreifen, das ArrayIndexOutOfBound verursacht.

Fix: Mindestens sicher, dass der Index i< oddNumber.length und i< numbers.length

Zum Beispiel

for(i=0; i <numbers .length && i<oddNumbers.length; i++){ 
0

Problem Aussagen unten sind. Abhängig von den erzeugten Zufallszahlen ergibt sich eine der Aussagen in ArrayIndexOutBoundsException.

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

Hier sind einige der Möglichkeiten, dies zu beheben:

  1. pflegen getrennte Indizes für evenNumbers und oddNumbers in

    for(i=0; i < numbers.length; i++){ 
        if((numbers[i] % 2) == 0) 
        { 
         evenNumbers[eIndex++] = numbers[i]; 
        } 
        else 
        { 
         oddNumbers[oIndex++] = numbers[i]; 
        } 
    
    } 
    
  2. Verwenden List<Integer> für 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]); 
        } 
    } 
    
Verwandte Themen