2014-12-20 44 views
-2

我在製作一個程序來查找素數。我將兩個ArrayList<Integer>中的素數和所有正整數(現在直到100)存儲起來。下面的代碼:ArrayList:IndexOutOfBounds異常問題

import java.util.ArrayList; 
public class PrimeNumbers { 
static ArrayList<Integer> num = new ArrayList<Integer>(); 
static ArrayList<Integer> prime = new ArrayList<Integer>(); 
public static void main(String[] args) { 
    prime.add(2); 
    prime.add(3); 
    prime.add(5); 
    for (int z = 1; z<=100; z++){ 
     num.add(z); 
    } 
    outer: for (int a = 1; a <=num.size(); a++){ 
     inner: for (int b = 1; b <=prime.size(); b++){ 
      if (num.get(a)%prime.get(b) != 0){//line 14 
       if (prime.indexOf(b)+1 == prime.size()){ 
        prime.add(a); 
        continue outer; 
       } 
       else 
        continue inner; 
      } 
      else 
       continue outer; 
     } 
    } 
    System.out.println(prime); 

    } 
} 

但是當我運行該程序,這些錯誤顯示:

異常線程 「main」 java.lang.IndexOutOfBoundsException:指數:3,大小:3 在java.util.ArrayList.rangeCheck(ArrayList.java:653) 在java.util.ArrayList.get(ArrayList.java:429) 在PrimeNumbers.main(PrimeNumbers.java:14)

是什麼出錯了?

+0

你可能會對我的簡短的[java調試教程](http://keysersblog.wordpress.com/2014/04/21/debugging-java-code-a-beginners-guide/)感興趣。我甚至使用IndexOutOfBoundsException作爲例子。另外,你可能不應該使用goto's(繼續x)。 – keyser

+0

gotos在繼續嗎? –

+0

是的,正如在繼續使用中一樣,還有標籤。這或多或少是一件遺物。 – keyser

回答

2

列表索引從0運行到size()-1,但您從1循環到size()

+0

所以我應該怎麼做? –

+1

像這樣重寫你的循環:'for(int a = 0; a Axel

0

Collection的第一個元素索引0而不是1。因此,例如,訪問第三個元素應完成爲collection.get(2)

你應該循環迭代像如下:

outer: for (int a = 0; a < num.size(); a++){ 
    inner: for (int b = 0; b < prime.size(); b++){ 
     ... 
    } 
} 

注意嚴格(<)指數的比較。此外,還有以下簡單的方法:

outer: for (Integer numItem : num){ 
    inner: for (Integer primeItem : prime){ 
     ... 
    } 
} 

for對整個收集循環迭代形式。

+0

我將1更改爲0,但它仍然不起作用 –

+0

您忽略將<='更改爲<<'。 – Axel

+0

我改變了它們,但它沒有返回0到100之間的素數,它只是顯示起始列表([2,3,5]) –

0

嘗試使用Double而不是整數。 (注意Double是一個大寫「D」的對象)。