请帮忙看一下这个程序为什么会产生这样的异常

longago172 2007-01-26 06:11:02

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这个数是如何产生的,谢谢
...全文
给本帖投票
841 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
多层循环,即使只执行 A=1; 这样简单的赋值,如果次数过多,也容易出现问题。
以前的编程语言,一般是不做循环次数判断,导致执行起来形成假死状态。到JAVA的时候,在语法似乎是进行了检测,有一次我作过这样的实验,就给了错误信息。
journeydj 2007-01-27
  • 打赏
  • 举报
回复
ArrayIndexOutOfBoundsException 数组下标越界
m0317045 2007-01-26
  • 打赏
  • 举报
回复
比如说你循环1下面有循环2,循环2下面有循环3....一直到循环15678907654.
然后他的可能取值为最大为4,(就象你说的你书里的32一样)如果在大了就溢出,
如果现在另一个循环,循环1下面有循环2,循环2下面有循环3.....一直到循环1567890765
那么他的可能取最大值至少比4大,5,6或者更大.
这样一直循环减少...
...
..
当只有一个循环的时候,取值在计算机允许的条件下,通常不能溢出.
:)
longago172 2007-01-26
  • 打赏
  • 举报
回复
谢谢各位,明白了!
iceman_009 2007-01-26
  • 打赏
  • 举报
回复
再回复一次
46349 46349 的乘积超过了 int 允许的最大值 (2147483647) ,就成了 -2146737495 ,-2146737495确实小于10000,但取不到数组中的对应的值。
iceman_009 2007-01-26
  • 打赏
  • 举报
回复
2148229801= 46349 46349
boolean[] a = new boolean[2148229801] 时直接报错
china8848 2007-01-26
  • 打赏
  • 举报
回复
int类型的范围:-2147483648~2147483647 虽然100000没有超过以上范围,但是程序24行:
for(int j=i;j*i<N;j++)中判断j*i<N时需要计算到近视100000*100000的数,这个数已经大于2147483647,所以出现异常。
iceman_009 2007-01-26
  • 打赏
  • 举报
回复
-2146737495 是java允许的数组长度最大值, 46349 46349 的乘积超过了
longago172 2007-01-26
  • 打赏
  • 举报
回复
To m03170450():
不好意思,你的解释我不太明白,能不能具体的说明一下。套的循环越多,可能达到的最大数就越小是什么意思。谢谢

(这个程序里的a[0]和a[1]没有赋值)
m0317045 2007-01-26
  • 打赏
  • 举报
回复
恩,我说的思路是电脑的思路,
呵呵,
如果数小肯定没问题,
在套一层循环数小的话也没问题,
就是说你套的循环越多,可能达到的最大数也就越小,
因为数大了,就出现溢出异常了.
ArrayIndexOutOfBoundsException---这就是说溢出了 :)

FedoraCoreIII 2007-01-26
  • 打赏
  • 举报
回复
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时
大头贼 2007-01-26
  • 打赏
  • 举报
回复
把代码行数也写出来
a[0]和a[1]等于多少?
longago172 2007-01-26
  • 打赏
  • 举报
回复
思路应该是没问题的吧,这是书上的一个原程序,只不过在书上求的是小于32的素数,我在这里把它换成了100000,结果就溢出了。但是我觉得在for循环里已经用i*j判断过了,所以应该不会溢出的。
m0317045 2007-01-26
  • 打赏
  • 举报
回复
没仔细看,
就看到你那一连串的for
所以溢出了,
你的思路不对,
有更简单的方法来计算素数.
重新想一下. :)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部