2014-12-20 47 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”的对象)。