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这个数是如何产生的,谢谢
就看到你那一连串的for
所以溢出了,
你的思路不对,
有更简单的方法来计算素数.
重新想一下. :)
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时
呵呵,
如果数小肯定没问题,
在套一层循环数小的话也没问题,
就是说你套的循环越多,可能达到的最大数也就越小,
因为数大了,就出现溢出异常了.
ArrayIndexOutOfBoundsException---这就是说溢出了 :)
不好意思,你的解释我不太明白,能不能具体的说明一下。套的循环越多,可能达到的最大数就越小是什么意思。谢谢(这个程序里的a[0]和a[1]没有赋值)
for(int j=i;j*i<N;j++)中判断j*i<N时需要计算到近视100000*100000的数,这个数已经大于2147483647,所以出现异常。
boolean[] a = new boolean[2148229801] 时直接报错
46349 46349 的乘积超过了 int 允许的最大值 (2147483647) ,就成了 -2146737495 ,-2146737495确实小于10000,但取不到数组中的对应的值。
以前的编程语言,一般是不做循环次数判断,导致执行起来形成假死状态。到JAVA的时候,在语法似乎是进行了检测,有一次我作过这样的实验,就给了错误信息。