当我运行程序时,我得到以下异常:
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();
}
答案 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
这个变成动态的,前列表。