public class Primes {
public static void main(String[] args) {

    int N=Integer.parseInt(args[0]);
    boolean[] a;
    try{
     a=new boolean[N];
    }catch(OutOfMemoryError e){
     System.err.println("Out of Memory");
       return;
    }
      for(int i=2;i<N;i++)a[i]=true;

 for(int i=2;i<N;i++)
if(a[i]!=false)
for(int j=i;j*i<N;j++)
a[i*j]=false;
 for(int i=0;i<N;i++) 
   if(a[i])System.out.print(" "+i);
 System.out.println();
}}
这是一个求素数的程序,当我输入100000时,程序产生Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2146737495
at Primes.main(Primes.java:24)
这样的异常,请问这个程序为什么会产生这样的异常,还有-2146737495这个数是如何产生的,谢谢

解决方案 »

  1.   

    没仔细看,
    就看到你那一连串的for
    所以溢出了,
    你的思路不对,
    有更简单的方法来计算素数.
    重新想一下.  :)
      

  2.   

    思路应该是没问题的吧,这是书上的一个原程序,只不过在书上求的是小于32的素数,我在这里把它换成了100000,结果就溢出了。但是我觉得在for循环里已经用i*j判断过了,所以应该不会溢出的。
      

  3.   

    package io;public class Primes { public static void main(String[] args) { int N = Integer.parseInt(args[0]);
    boolean[] a;
    try {
    a = new boolean[N];
    } catch (OutOfMemoryError e) {
    System.err.println("Out of Memory");
    return;
    } for (int i = 2; i < N; i++)
    a[i] = true; for (int i = 2; i < N; i++) {
    if (a[i] != false)
    for (int j = i; j * i < N; j++) {
    System.out.println(i * j+"  "+i+" "+j);
    a[i * j] = false;//这个地方超出了数组a范围
    }
    }
    for (int i = 0; i < N; i++)
    if (a[i])
    System.out.print(" " + i);
    System.out.println();
    }}
    当i = 313 j = 319时
      

  4.   

    恩,我说的思路是电脑的思路,
    呵呵,
    如果数小肯定没问题,
    在套一层循环数小的话也没问题,
    就是说你套的循环越多,可能达到的最大数也就越小,
    因为数大了,就出现溢出异常了.
    ArrayIndexOutOfBoundsException---这就是说溢出了  :)
      

  5.   

    To m03170450():
     不好意思,你的解释我不太明白,能不能具体的说明一下。套的循环越多,可能达到的最大数就越小是什么意思。谢谢(这个程序里的a[0]和a[1]没有赋值)
      

  6.   

    -2146737495 是java允许的数组长度最大值, 46349 46349 的乘积超过了
      

  7.   

    int类型的范围:-2147483648~2147483647 虽然100000没有超过以上范围,但是程序24行:
    for(int j=i;j*i<N;j++)中判断j*i<N时需要计算到近视100000*100000的数,这个数已经大于2147483647,所以出现异常。
      

  8.   

    2148229801=  46349 46349  
    boolean[] a = new boolean[2148229801] 时直接报错
      

  9.   

    再回复一次
    46349 46349 的乘积超过了 int 允许的最大值 (2147483647) ,就成了 -2146737495 ,-2146737495确实小于10000,但取不到数组中的对应的值。
      

  10.   

    多层循环,即使只执行 A=1; 这样简单的赋值,如果次数过多,也容易出现问题。
    以前的编程语言,一般是不做循环次数判断,导致执行起来形成假死状态。到JAVA的时候,在语法似乎是进行了检测,有一次我作过这样的实验,就给了错误信息。
      

  11.   

    ArrayIndexOutOfBoundsException 数组下标越界