2016-10-31 7 views
0

配列を扱う学校用のプロジェクトを行っていますが、問題が発生しました。誰かが私が得ているエラーを説明できるかどうか疑問に思っていた。ここに私のコードです:多次元配列のコード結果が "ArrayIndexOutOfBoundsException"エラー

public class ArrayPrinter 
{ 
    public static void main(String[] args) 
    { 
     int [] oneD = {5, 6, 7, 8 }; 

     int[][] twoD = {{2, 4, 6, 8}, 
         {8, 7, 9, 1}, 
         {3, 5, 1, 2}}; 

     int[][] twoD2 = {{1, 2}, 
         {3, 4, 5}, 
         {6}, 
         {7, 8, 9}}; 

     printArray(oneD); 

     printArray(twoD); 

     System.out.println(" "); 

     printArray(twoD2); 
    } 


    public static void printArray(int[] arr) { 

     int size = arr.length; 
     System.out.print("["); 
     for(int i=0;i< size; i++){ 
      System.out.print(arr[i]); 
      if(i<size-1){ 
       System.out.print(","); 
      } 
     } 
     System.out.println("]"); 
    } 

    public static void printArray(int[][] arr) 
    { 

      System.out.println("[ "); 

      for (int row = 0; row < arr.length; row++){ 

       System.out.print(""); 

       for (int i = 0; row < arr[row].length; i++) 
       { 
        printArray(arr[i]); 

       } 
       System.out.println("]");    

      }   
    } 
} 

私はEclipseでこれを実行するとエラーが発生します。これは私の出力です:

[5,6,7,8] 

[ 

[2,4,6,8] 

[8,7,9,1] 

[3,5,1,2] 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 

at ArrayPrinter.printArray(ArrayPrinter.java:51) 

at ArrayPrinter.main(ArrayPrinter.java:19) 

どうすればこのエラーを修正できますか?そして、あなたは理由を説明してください、むしろそれは私のためにそれをするのですか?

+1

'のために(int型私= 0;行

+0

と2次元配列のarr [行] [i]のような両方のインデックスを使用する必要があります1D配列を参照するarr [i]を行う代わりに –

+0

例外について何か調べましたか?エラーメッセージのどの部分があなたに混乱していますか? – csmckelvey

答えて

-1

あなたはprintArray(int[][] arr)でやっていることについて考える:

for (int row = 0; row < arr.length; row++){ 
    ... 
} 

これは、配列の行をループします。これらの行はすべて配列であることを忘れないでください。この時点で、arr[row]のタイプはint[]です。 int[]を受け入れるprintArray関数があるので、それを呼び出します。 iをループする部分は不要です。

IndexOutOfBoundsExceptionは、範囲外の配列の要素にアクセスしようとすると発生します。たとえば:

int[] arr = {42}; 
arr[3] // IndexOutOfBoundsException! arr has length 1, so arr[3] is out of bounds 

あなたはiをループしようとしているので、あなたがエラーを取得しているが、終了条件はrow < arr[row].lengthです。つまり、最初の繰り返しではrowは0になります。これはiループに入り、0 < twoD2[0].length(それ)であるかどうかを確認してからtwoD2[i]にアクセスします。その後、iをインクリメントして、もう一度チェックを行いますが、rowは更新されていません。ループのエントリで条件が真であり、条件で使用される変数を変更しない場合、ループを終了することはありません。したがって、iは増分を停止せず、最終的にはtwoD2[4]にアクセスして例外を取得しようとします。

+0

これは完全に意味があります!説明してくれてありがとう!今私はそれが将来起こるかどうか知っている!私は今私が試してみることができる最後のものであるので、今3日間それを把握しようとしていて、ここに投稿しました。もう一度、ありがとう! – BlazeRyder

-1

はず多次元配列を印刷するための方法:

public static void printArray(int[][] arr) { 
    System.out.println("[ "); 
    for (int row = 0; row < arr.length; row++) { 
     printArray(arr[row]); 
    } 
    System.out.println("]"); 
} 
+0

ユーザーがエラーメッセージの説明を求めました。これはそうではありません。 –

0

あなたは、次のコードがあります。これは多くの意味がありません

System.out.println("[ "); 
    for (int row = 0; row < arr.length; row++) { 
     System.out.print(""); 
     for (int i = 0; row < arr[row].length; i++) { 
      printArray(arr[i]); 
     } 
     System.out.println("]");    
    } 

を。あなたの内側のループではarr[i]を参照しています。インデックスを使用して0からarr[row]の範囲でint[]を返しています。つまり、現在の行に要素があるように、行全体を印刷します。それは明らかにあなたが欲しいとは思わない。

実際には、内部ループはまったく必要ありません。 int[]を印刷するメソッドを既に持っているので、実際には行を繰り返し処理するだけです。

System.out.println("[ "); 
    for (int row = 0; row < arr.length; row++) { 
     System.out.print(""); 
     printArray(arr[row]); 
    } 
    System.out.println("]");  

はまた、あなたが使用している場合、あなたのコードの多くは単純かもしれないことに注意のために、各ループ:

for (int[] row: arr) { 
    printArray(row); 
}