2016-04-03 15 views
-1

乱数を生成して配列に格納するJavaプログラムで作業しています。次に、プログラムは配列を通り、偶数と奇数を2つの新しい配列に入れ、それらをユーザーに提示することになっています。このプログラムはまた、アレイ内に存在する奇数および偶数の数をユーザーに伝えます。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 pczeus

答えて

0

本当にループを複数回実行することをお勧めではありません。

ランダムな配列を1回だけトラバースするコードがあります。

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

Wow @KevinO。それは実際に私が望むように正確に機能しました。ブリリアント - ありがとう! – Emil

0

問題がある:

oddNumbers[i]=numbers[i]; 

ので:あなたは配列の要素にアクセスするためのインデックスiを使用する場合oddNumbersの要素数がnumbers

と同じではありませんnumber 、偶然、ArrayIndexOutOfBoundの原因となるoddNumberi^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. はoddNumbers & evenNumbersため

    for(i=0; i < numbers.length; i++){ 
        if((numbers[i] % 2) == 0) 
        { 
         evenNumbers[eIndex++] = numbers[i]; 
        } 
        else 
        { 
         oddNumbers[oIndex++] = numbers[i]; 
        } 
    
    } 
    
  2. で使用List<Integer>をevenNumbersとoddNumbersに別々のインデックスを維持します。

    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]); 
        } 
    } 
    
関連する問題