java里递归次数太多,为什么会出错?

萌新自己写了一个用链表找质数的代码,运行时没问题,但如果输入的数太大,就会出错,为什么会这样?求大神解答,万分感谢!
代码如下:

//一个找出质数的程序

public class Zhishu{
public static Zhishu firstZhishu=new Zhishu(2);
public Zhishu next=null;
public int number=0;

  private Zhishu(int number){
     this.number=number;
  }

  public static void main(String[] args){
     Zhishu.find(19);
     Zhishu.find(17);
     Zhishu.find(100);
     Zhishu.find(1000);
     Zhishu.find(1069);
     Zhishu.find(3630);
     Zhishu.find(5000);
  }

  public static void find(int n){
     find(n,firstZhishu);
  }

  private static void find(int n,Zhishu a){
        if (n==a.number){
           System.out.println(n+"是质数");
           return;
        }else if(n<a.number){
           System.out.println(n+"不是质数");
           return;
        }else if(a.next==null){
           find(a.number+1,n,a);
        }else{
           find (n,a.next);
        }
  }



  private static void find(int i,int n,Zhishu a){
     if (i<n){
        if (test(i,firstZhishu)){
           a.next=new Zhishu(i);
           find(i+1,n,a.next);
        }else{
           find(i+1,n,a);
        }
     }else{
        if (test(n,firstZhishu)){
           a.next=new Zhishu(n);
           System.out.println(n+"是质数");
        }else{
           System.out.println(n+"不是质数");
        }
     }
  }

  private static boolean test(int i,Zhishu a){
        if (i%a.number==0){
           return false;
        }else if(a.number*2>i){
           System.out.println("找到质数"+i);
           return true;
        }else{
           return (test(i,a.next));
        }
  }

}

运行结果如下:图片说明

图片说明

8个回答

如果报的是栈溢出就没什么好奇怪的哈,递归次数过多,虚拟机一直执行压栈操作,很快栈内存就不足了,你可以把线程的栈内存空间分配大点

h960321
极昼暗语leo 回复wb_snail: 十分感谢!!加了之后可以弄到13000多次了,再百度了一下,大概懂了,应该就是栈内存不足的问题,谢谢大佬啦~
接近 2 年之前 回复
wb_snail
wb_snail 回复极昼暗语leo: java -Xss1M Zhishu
接近 2 年之前 回复
h960321
极昼暗语leo 回复wb_snail: 怎么加啊?萌新不会啊,是java Zhishu -Xss10M吗?这样运行结果没区别,还是会出错
接近 2 年之前 回复
wb_snail
wb_snail 回复极昼暗语leo:执行的时候加个参数 -Xss10M 看看到多少报错
接近 2 年之前 回复
h960321
极昼暗语leo 看不到报的什么错啊,出错的时候就如图一,前面超出显示了,看不到。。。而且是突然质变的,就如5680没出错,但5681就出错了,然后过了一会儿再运行,5680也出错了,再过一会儿再运行5680没问题了,甚至5690也没问题了。。。我有点懵。。。
接近 2 年之前 回复

我也试了一下,死递归不被java允许,java会在你递归过多次后抛出错误,所以如果你想尝试死循环,你得while(true) 或者for(;;);也就是说你的程序绝对无可能一直运行下去

qq_24712507
奔跑的_迷彩狼 回复极昼暗语leo: 你可以把它想象成一个圆,超过最大的就是最小的
接近 2 年之前 回复
h960321
极昼暗语leo 回复小牛宝: 233333好吧,好吧,不能溢出。话说以前又一次用long的时候超出了最大值,竟然输出来负数而不是报错,感觉好奇怪啊2333
接近 2 年之前 回复
qq_34547022
小牛宝 那你又错了,如果你使用int 类型,超过integer.MAXVALUE,就会出错,如果是long类型,也是超过最大值出错。
接近 2 年之前 回复
h960321
极昼暗语leo 成了~~~可以一直运行啦~不管输多大的数都没问题~~~~~谢谢啦~~~
接近 2 年之前 回复
h960321
极昼暗语leo 嗯嗯~好像是的啊~想了一下,我这程序如果想一直运行下去,那我每1000此递归退出一下,把栈释放了,再继续递归,好像有戏,马上去试试~
接近 2 年之前 回复

出错的截图是什么?

贴图看看

h960321
极昼暗语leo 看不到报的什么错啊,出错的时候就如图一,前面超出显示了,看不到。。。而且是突然质变的,就如5680没出错,但5681就出错了,然后过了一会儿再运行,5680也出错了,再过一会儿再运行5680没问题了,甚至5690也没问题了。。。我有点懵。。。
接近 2 年之前 回复

你的递归上SystemClock.sleep(100);延迟个一百毫秒,那么不管你递归多少次,都不会有错。

h960321
极昼暗语leo 我写了import android.os.SystemClock;然而他告诉我android.os找不到qwq什么情况.....
接近 2 年之前 回复

哦是我的错,你应该写java的try{
Thread.sleep(100);
}catch(Exception e){
}

h960321
极昼暗语leo 哦,这个貌似没用,还是会溢出,我刚刚在测试的时候加了这个,只不过只sleep(10)
接近 2 年之前 回复

不然不管你分配多大内存,迟早有天都会出错,话说你也没办法分配内存。楼上你采纳的答案肯定没用,你知道怎么分配更大的内存么,哥哥我做了五年java,都不知道我要怎么给我的软件分配更大的内存。所以最低延迟100毫秒,因为jvm虚拟机回收内存的时间一般是50-80毫秒,你得错开这段时间

h960321
极昼暗语leo 唔,刚刚试了一下,好像还是会出错啊,我的应该是递归太多导致栈溢出了,sleep虽然让程序停在那里,但内存回收机也不会回收那个等待运行中的栈吧?执行到一半的程序应该不会被视为垃圾吧?还是谢谢你啦~
接近 2 年之前 回复

递归次数过多,虚拟机一直执行压栈

你知道sleep是啥意思么,一秒钟分为1000毫秒,1000毫秒又分为1000微秒 10 就是百分之一秒。延迟那么少有个毛线用,听哥的,延迟加到500,保证你无限循环都不会有错

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!