1

プログラムを実行すると、次の例外が発生します。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
        at eraKevgiri.main(eraKevgiri.java:29)

このコードの問題は何ですか?

public static void main(String[] args) {
    int gSayi = 0;
    int kKok = (int) Math.sqrt(gSayi);
    boolean[] liste = new boolean[gSayi + 1];

    Scanner klavye = new Scanner(System.in);
    System.out.println("Sayı Girin:");
    gSayi = klavye.nextInt();

    for(int i=2; i<=kKok; i++){
        System.out.println("" +i);
        for(int j=i*i; j<=gSayi; j+=i){
            liste[j] = true;
        }
    }

    for(int k=kKok; k<=gSayi; k++){ 
        if(!liste[k]){ //-------> problem in here
            System.out.println("" + k);
        }
    }
    klavye.close();
}
4

4 に答える 4

2

あなたは移動する必要があります

Scanner klavye = new Scanner(System.in);
System.out.println("Sayı Girin:");
gSayi = klavye.nextInt();

そうしないと、配列には常に 1 つの要素しかなく、もちろんインデックス 1 の要素はありません。

于 2012-10-29T16:10:32.623 に答える
1

最初に size の配列を割り当てます。gSayi + 1これは0 + 1 = 1です。後で、要素を 1 つだけ持つgSayiの要素を変更してアクセスしようとしますliste

したがって、gSayi配列を変更したり、変更された値に調整したりしないでください。

于 2012-10-29T16:12:08.860 に答える
1

あなたは間違った順序で物事をやっています。電話すると:

boolean[] liste = new boolean[gSayi + 1];

gSayi + 1は常に1ここにあるため、要素が 1 つだけの配列を作成しています。次のようにコードを移動します。

Scanner klavye = new Scanner(System.in);
System.out.println("Sayı Girin:");
int gSayi = 0;
gSayi = klavye.nextInt();
int kKok = (int) Math.sqrt(gSayi);
boolean[] liste = new boolean[gSayi + 1];

を更新するため、配列のサイズは変わりませんgSayi。と同様にkKok、 の新しい平方根に更新されませんgSayi。その時点での値が使用されます。

于 2012-10-29T16:12:51.763 に答える
0

for(int k=kKok; k<=gSayi; k++)ここで gSayi の値はユーザーから取得されます。したがって、1 より大きい場合、boolean[] listeサイズが1 であるためエラーが発生します。これliste[k]が、範囲外になる理由です。

listeこれを動的な、たとえばリストにする必要があります。

于 2012-10-29T16:13:05.170 に答える