1

次のエラーが表示されますが、その理由はわかりません。調べてみましたが、解決策が見つかりませんでした。

スレッド「メイン」の例外 java.lang.ArrayIndexOutOfBoundsException: problem2.main で 1000000 (problem2.java:17)

これが私のコードです:

//Each new term in the Fibonacci sequence is generated by adding the previous two terms.
//By starting with 1 and 2, the first 10 terms will be:
//1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
//By considering the terms in the Fibonacci sequence whose values do not exceed four million, 
//find the sum of the even-valued terms.

public class problem2 {
    public static void main(String[] args) {
        int []a = new int[1000000];
        a[0] = 1;
        a[1] = 2;
        int sum=0;

        int i=2;
        while(a[i]<=4000000){
            a[i] = a[i-1] + a[i-2];
            i++;
        }

        for(int j=0;j<i;j++){
            sum = sum + a[j];
        }

        System.out.println("The sum is: " + sum);
        System.out.println("\nThere are " + i + " numbers in the sequence.\n");
        System.out.println("This are all the numbers in the sequence:");

        for(int j=0;j<i;j++){
            if(j+1==i){
                System.out.print(a[j] + ".");
                break;
            }

            System.out.print(a[j] + ", ");
        }
    }
}
4

9 に答える 9

2

このエラーは、ループの終了条件に達するi前に1000000(配列のサイズ)に達することが原因で発生します。a[i]の値をテストする代わりに、a[i]次のようなforループを使用する必要があります。

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

さらに、longの項目にはintではなくtypeを使用する必要があります。aこれは、値が大きくなりすぎてint型をオーバーフローし、負の値にラップアラウンドするためです。例:

1872856136
1063031469
-1359079691
-296048222
-1655127913
-1951176135
688663248

編集:実際、1000000要素の配列を使用しても、long十分な大きさではありません-本当にこれほど大きな値が必要な場合は、BigIntegerを使用する必要があります

于 2012-08-17T12:02:58.737 に答える
2

問題はのサイズではありませんint[]

whileループは、変数がすでに1インデックス先にある間a[i]よりも小さいかどうかを常にチェックしています。各ループには。4000000ia[i] == 0

この変更により、コードが修正されます。

int i=1;
while(a[i]<=4000000){
    i++;
    a[i] = a[i-1] + a[i-2];
}
于 2012-08-17T12:10:11.777 に答える
1

whileループでは、完了したかどうかを確認する前にiをインクリメントします。その条件が評価されるときはいつでも、計算しようとしている要素で評価されますが、まだ何もありません。

これは、whileループが終了することはなく、最終的にiは1,000,000になり、その時点a[i]で評価できなくなり、この例外がスローされることを意味します。これは、の最後の要素がであるためaですa[999999]

これはいくつかの方法で修正できます。最も明確なのは、1から開始し、に割り当てる前にそれiをインクリメントすることです。a[i]

余談ですが、固定サイズの配列は一般的に悪い選択であり、のような可変サイズのリストArrayList<E>がより良い選択です-この特定のケースでは、ロジックのバグのために、最終的にはOutOfMemoryExceptionが発生します。

于 2012-08-17T12:02:17.303 に答える
1

配列aには、ゼロから始まる 1,000,000 個の要素が含まれています。ここでそれらをループすると:

while(a[i]<=4000000)

インデックス容量を超えています。容量を超える最初のインデックスは 1,000,000 であるため、エラーになります。

于 2012-08-17T11:58:43.440 に答える
0

条件を追加する while(i < a.length && a[i]<=4000000)

于 2012-08-17T12:01:55.620 に答える
0

問題はwhileループにあり、状態を調べます

while(a[i]<=4000000)
于 2012-08-17T12:02:37.153 に答える
0

他の人が指摘しているように。あなたはこのようにすることができます:

 int i=2;
for(;i<a.length && a[i]<=4000000;i++)
{
     a[i] = a[i-1] + a[i-2];

}

値が400000未満であり、インデックスが100000未満である必要があることを確認します。

于 2012-08-17T12:07:12.770 に答える
0

問題はここにあります

while(a[i]<=4000000)

あなたの場合、次のようにすることができます

while(i < a.length && a[i]<=4000000 ){
    a[i] = a[i-1] + a[i-2];
    i++;        
}

そして、あなたのプログラムは完璧に動作します..

于 2012-08-17T11:59:58.443 に答える