2013-05-18 16 views
6

ループで再生中に以下のコードを作成しました。以下のコードは、フィボナッチ値を配列に格納し、forループを使用してそれらを出力します。Forループ例外の拡張

int [] numbers; 
    numbers = new int[25]; 

    numbers[0] = 1; 
    numbers[1] = 1; 
    System.out.println("Initializing the array values"); 

    for(int i = 2; i < numbers.length; i++) 
    { 
     numbers[i] = numbers[i-1] + numbers[i-2]; 
    } 

    System.out.println("Printing out Fibonacci values"); 

    for(int i = 0; i < numbers.length; i++) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

上記のコードは正常に動作します。最初に私は一緒に投げたが、私は強化されたforループを使って値を出力した(コードの2番目のforループ)。これはうまくコンパイルされますが、実行すると次のようになります。

Initializing the array values 
Printing out Fibonacci values 
1, 1, 2, 3, 8, 34, 377, 17711, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 34 
at ArrayDemo.main(ArrayDemo.java:21) 

私は何がうまくいかなかったのですか? 2番目のループを変更しても値を変更すべきではありません(フィボナッチの値が間違っている(つまり欠損値))。そして、単純な拡張forループがインデックスをスキップする理由がわかりません。さて、これは本当に大きな問題ではありません。なぜなら、これはプロジェクトや何かのためではないからです。なぜそれがそれをやっているのか分かりません。すべての手がかりは?

強化されたforループは、このように見えます。

for(int i : numbers) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

答えて

5
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

iアレイではなく、インデックスに要素あります。それはnumbers.lengthより大きい可能性があります。

例えば、numbers = {1,2,3,9}ならば、i1239あろう。しかし、その長さは4です。その内部の要素をループすると、そのサイズを超えるnumbers[9]をしようとしています。

はおそらく、あなたがforループ強化にインデックスを使用する必要はありません

for(int i : numbers) 
    { 
     System.out.print(i + ", "); 
    } 

でなければなりませんSystem.out.print(i + ", ");

+1

ありがとうございます。簡潔で分かりやすい –

5

for(int i = 0; i <= numbers.length; i++) Javaで

for(int i = 0; i < numbers.length; i++)

であるべきで、配列は0ベースのインデックスです。それはあなたの最初の要素が等価である、tab[2]またはtab[tab.length-1]を呼び出すことによって、ここで1

int tab[] = new int[3]; //tab of length 3 
tab[0] = 11; 
tab[1] = 24; 
tab[2] = 5; 

あなたが最後の要素にアクセス減じたもの、あなたの配列の長さで、明らかに最後のインデックス0にアクセスしなければならないことを意味します。私は 質問に置くコードでちょうど間違いだった


謝罪、。

問題は、あなたがすべきことである:System.out.print(i + ", "); あなたが拡張forループについてthisthisをお読みください。

if文のためにも、このフォームは時々文の強化 と呼ばれ コレクションと配列の繰り返し処理のために設計された別のフォームを持っており、あなたのループはもっと作るために使用することができ コンパクトで読みやすいです。

class EnhancedForDemo { 
    public static void main(String[] args){ 
     int[] numbers = 
      {1,2,3,4,5,6,7,8,9,10}; 
     for (int item : numbers) { 
      System.out.println("Count is: " + item); 
     } 
    } 
} 

で:

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

次のプログラム、EnhancedForDemoは、配列をループにするために強化され使用しています:実証するために、番号を保持し、次の 配列、1〜10を検討この例では、変数itemは数値配列から現在の値であるを保持しています。

したがってitemは、数値配列の現在の値を保持し、ではなく、の現在のインデックスを保持します。だからこそあなたはIOOBEを手に入れました。ここで

+3

0ベースのインデックスについての簡単な説明は、これをすばらしい答えにします。 – christopher

+0

申し訳ありません、それは私が質問に置いたコードの単なる誤りでした。それは最初に正しく行われました。 forループがうまく動作しない理由はまだ説明していません。これを反映するために質問コードを編集しました。 –

2
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

にしたいです。

関連する問題