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;kfor(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它有。你需要它们来进行“埃拉托斯提尼筛”算法。否则你无法达到(用户输入的)所有素数。