实现Eratosthenes筛选时的ArrayIndexOutOfBoundsException

时间:2012-10-29 16:05:49

标签: java exception sieve-of-eratosthenes

当我运行程序时,我得到以下异常:

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 个答案:

答案 0 :(得分:3)

你应该移动

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

到方法的开头,否则数组将始终只有一个元素,然后当然没有索引为1的元素。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

你正在以错误的顺序做事。当你打电话:

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的新平方根。它将使用该时间实例的值。

答案 3 :(得分:0)

for(int k=kKok; k<=gSayi; k++)这里gSayi的价值取自用户。因此,如果它大于1,则会在boolean[] liste大小为1时引发错误。这就是liste[k]越界的原因。

你应该将liste这个变成动态的,前列表。