问题在注释里,运行的错误信息在程序下方。
import java.util.Arrays;
public class PrimeNumber
{
   public void showPrimeNumber(int range)
   {
      boolean[] primes=this.sieve(range);
       int number=0;
       if (primes !=null)
   {
       int size=primes.length;
       System.out.println("范围在"+range+"内的质数个数有:");
      int i=0;
       for (i=1; i<size; i++);
       {
           if(primes[i])
           {
           System.out.print(i+"  ");
          
           if(++number%10==0)
           {
              System.out.println();
            }
        }
    }
    System.out.println();
  }
  System.out.println("一共有"+number+"个"); 
}
private boolean[] sieve(int range)
{
if(range<=0)
{
System.out.println("求质数的范围range必须大于0!");
return null;
}
boolean[] isPrime=new boolean[range+1];
   isPrime[1]=false;
   Arrays.fill(isPrime,2,range+1,true);
   int n=(int) Math.sqrt(range);  //这里的n是怎么得来的,为什么是range的开方?看不懂。
   for(int i=1;i<=n;i++)
   {
     if(isPrime[i])
     {
      for(int j=2*i;j<=range;j+=i)
     { isPrime[j]=false;
      }
     }
    }
    return isPrime;
}
public static void main(String[] args)
{
int range=200;
PrimeNumber test=new PrimeNumber();
test.showPrimeNumber(range);
 } 
}错误信息:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 201
at PrimeNumber.showPrimeNumber(PrimeNumber.java:15)
at PrimeNumber.main(PrimeNumber.java:55)这个错误怎么解决?

解决方案 »

  1.   

    去掉那个多余的分号就好了。import java.util.Arrays;public class PrimeNumber {
    public void showPrimeNumber(int range) {
    boolean[] primes = this.sieve(range);
    int number = 0;
    if (primes != null) {
    int size = primes.length;
    System.out.println("范围在" + range + "内的质数个数有:");
    int i = 0;
    for (i = 1; i < size; i++)//这儿多了一个分号;
    {
    if (primes[i]) {
    System.out.print(i + "  "); if (++number % 10 == 0) {
    System.out.println();
    }
    }
    }
    System.out.println();
    }
    System.out.println("一共有" + number + "个");
    } private boolean[] sieve(int range) {
    if (range <= 0) {
    System.out.println("求质数的范围range必须大于0!");
    return null;
    }
    boolean[] isPrime = new boolean[range + 1];
    isPrime[1] = false;
    Arrays.fill(isPrime, 2, range + 1, true);
    int n = (int) Math.sqrt(range); //这里的n是怎么得来的,为什么是range的开方?看不懂。
    for (int i = 1; i <= n; i++) {
    if (isPrime[i]) {
    for (int j = 2 * i; j <= range; j += i) {
    isPrime[j] = false;
    }
    }
    }
    return isPrime;
    } public static void main(String[] args) {
    int range = 200;
    PrimeNumber test = new PrimeNumber();
    test.showPrimeNumber(range);
    }
    }
      

  2.   


    import java.util.Arrays;
    public class PrimeNumber
    {
       public void showPrimeNumber(int range)
       {
             boolean[] primes=this.sieve(range);
           int number=0;
           if (primes !=null)
       {
              int size=primes.length;
              System.out.println("范围在"+range+"内的质数个数有:");
          int i=0;
              for (i=1; i<size; i++)//;这里都了个分号
              {
                     if(primes[i])
                     {
                     System.out.print(i+"  ");
                    
                     if(++number%10==0)
                     {
                           System.out.println();
                         }
                  }
           }
           System.out.println();
      }
      System.out.println("一共有"+number+"个"); 
    }
    private boolean[] sieve(int range)
    {
        if(range<=0)
        {
            System.out.println("求质数的范围range必须大于0!");
            return null;        
        }
        boolean[] isPrime=new boolean[range+1];
       isPrime[1]=false;
       Arrays.fill(isPrime,2,range+1,true);
       int n=(int) Math.sqrt(range);  //这里的n是怎么得来的,为什么是range的开方?看不懂。
    //这是质数的性质:不能被其平方以下的数整除的既是质数
       for(int i=1;i<=n;i++)
       {
            if(isPrime[i])
         {
             for(int j=2*i;j<=range;j+=i)
         {    isPrime[j]=false;
             }
         }
           }
           return isPrime;
    }
    public static void main(String[] args)
    {
        int range=200;
        PrimeNumber test=new PrimeNumber();
        test.showPrimeNumber(range);
     } 
    }
      

  3.   

    越界的错误我想你可以Debug一下就知道了。
    至于
    //这里的n是怎么得来的,为什么是range的开方?看不懂。
    这其实是求质数的一个算法,按常规我们都是从1到range,看看这个数有没有除1和自身以外的因子
    但是,可以证明,到这个数的平方根就可以得出他是否为质数
      

  4.   

    for (i=1; i<size; i++);
    //
    嗬嗬,看了楼上才发现。我经常犯阿
      

  5.   

    Math.sqrt(range)是Math类的静态函数  就是对range开方的意思