Java ArrayIndexOutOfBoundsException,同时执行Eratosthenes筛选

Java ArrayIndexOutOfBoundsException,同时执行Eratosthenes筛选,java,exception,sieve-of-eratosthenes,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); bo

当我运行程序时,出现以下异常:

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();
}
publicstaticvoidmain(字符串[]args){
int-gSayi=0;
int kKok=(int)Math.sqrt(gSayi);
布尔[]列表=新布尔[gSayi+1];
扫描仪klavye=新扫描仪(System.in);
System.out.println(“SayıGirin:”);
gSayi=klavye.nextInt();
对于(inti=2;i你应该移动

Scanner klavye = new Scanner(System.in);
System.out.println("Sayı Girin:");
gSayi = klavye.nextInt();
到方法的开头,否则数组将始终只有一个元素,当然没有索引为1的元素。

您应该移动

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

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

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


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

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


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

您的操作顺序错误。当您调用:

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

您的操作顺序错误。当您调用:

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

for(int k=kKok;k
for(int k=kKok;kYour数组没有您尝试访问的索引。请尝试向代码中添加断点,并在“调试更多”中查看数组的值,以验证您是否具有所需的数组中的值..只是一个问题…与主题无关,但…第一个“for”是否适用语句有什么作用吗?因为似乎您正在循环i=2,并且kKok wich已设置为0的sqrt,即0…@Noya yep它有什么作用。您需要它们用于“eratosthenes的筛选”算法。否则您无法访问(用户输入)所有素数。您的数组没有尝试访问的索引。请尝试向代码中添加断点,并在“调试更多”中查看数组的值,以验证您在所需的数组中是否有值。只是一个问题…与主题完全不符,但…第一个“for”是否正确语句有什么作用吗?因为你似乎在循环i=2,而kKok wich被设置为0的sqrt,这是0…@Noya-yep它有。你需要它们来进行“埃拉托斯提尼筛”算法。否则你无法达到(用户输入的)所有素数。