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 的元素。

于 2012-10-29T16:10:32.623 回答
1

您首先分配一个大小为 的数组gSayi + 1,即0 + 1 = 1. 稍后,您修改gSayi并尝试访问liste只有一个元素的 元素。

因此,您不得修改gSayi或将数组调整为修改后的值。

于 2012-10-29T16:12:08.860 回答
1

你做事的顺序不对。你打电话时:

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

您正在创建一个只有一个元素的数组,因为gSayi + 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 回答