2012-10-29 28 views
1

的篩當我運行我的程序,我得到以下異常:ArrayIndexOutOfBoundsException異常而實施埃拉托色尼

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

你的數組沒有你試圖訪問的索引。嘗試在你的代碼中添加斷點,然後在調試中查看你的數組的值,以驗證你所期望的數組中的值。 – blad

+0

只是一個問題......完全不在話題中,但是......第一個「爲」聲明做什麼?因爲它似乎是你騎自行車我= 2和KKOK已被設置爲0的sqrt爲0 ... – Noya

+0

@諾亞是的它的確如此。你需要他們的「eratosthenes篩」算法。否則,您無法訪問(用戶輸入的)所有素數。 – android93

回答

3

你應該將

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

該方法的開始,否則陣列將始終只有一個元素,然後當然還有與索引1

2

你沒有元素首先分配一個大小爲gSayi + 1的數組,即0 + 1 = 1。稍後,您修改gSayi並嘗試訪問僅有一個元素的liste的元素。

因此,您必須修改gSayi或將您的數組調整爲修改後的值。

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的新平方根。它將在該時刻使用該值。

0

for(int k=kKok; k<=gSayi; k++)此處gSayi的值取自用戶。所以,如果它大於1,那麼它會產生一個錯誤,因爲boolean[] liste大小是1.這就是爲什麼liste[k]超出限制。

你應該使liste這個動態,前列表。

相關問題