Java无止境递归和堆栈溢出错误

Java无止境递归和堆栈溢出错误,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,抱歉,可能是一个愚蠢的问题,我是Java新手 有没有一种方法可以在Java中进行无休止的递归,比如: public void sillyMethod() { System.out.println(i); i++; sillyMethod(); } 它抛出StackOverflowerr错误,但我真的想无限期地运行它。有没有办法做到这一点 谢谢 不是递归的,不是。它确实意味着创建一个不断增加的调用堆栈,最终您将耗尽包含它的内存。是和否,(但大部分是否!) 不,这是不可能

抱歉,可能是一个愚蠢的问题,我是Java新手

有没有一种方法可以在Java中进行无休止的递归,比如:

public void sillyMethod()
{
    System.out.println(i);
    i++;
    sillyMethod();

}
它抛出StackOverflowerr错误,但我真的想无限期地运行它。有没有办法做到这一点


谢谢

不是递归的,不是。它确实意味着创建一个不断增加的调用堆栈,最终您将耗尽包含它的内存。

是和否,(但大部分是否!)

不,这是不可能的(最明智的回答):
对于每个调用,都会有一条激活记录推送到JVM调用堆栈上。这将占用非零的内存量,因此您将在某个时候耗尽内存,此时将抛出StackOverflowException

是的,这是可能的(超理论的答案):
Java语言规范中没有明确指出最终会遇到StackOverflowException。这意味着,如果您找到一个足够的解理器编译器,它可能足够智能,可以将其编译成循环



一个相关的问题是,这个问题的答案是,“不,目前还没有,但未来版本也不排除这种情况”。

正如上面其他人所说,无限递归最终将导致堆栈溢出,至少就JVM实现而言是如此

您可以执行类似的操作,但可以通过在旧线程死亡之前生成新线程来避免堆栈扩展

public class SillyClass implements Runnable {

private final int count;

public SillyClass(int cnt) {
    this.count = cnt;
}

public static void main(String[] args) {
    Thread t = new Thread(new SillyClass(0));
    t.start();
}

@Override
public void run() {
    System.out.println(count);
    Thread t = new Thread(new SillyClass(count + 1));
    t.start();
}

}

使用Java,您无法做到这一点。但是,对于语言(特别是函数式语言,如Ocaml)中的尾部调用优化,您可以这样做,因为它在内部将其转换为循环

如果你真的想要“永无止境”,那就去迭代吧。读一读,你会发现你无法做到t@Anon迭代?这不会是无止境的,是吗?我的意思是,这就是迭代的全部意义,你可以计算一些相关的东西:@Sean:我使用迭代基本上是循环的同义词。此外,仅仅因为你在数数并不意味着你会停下来<代码>用于(i=0;i++)在任何语言中永远循环,并在溢出时进行无声环绕…然后激活记录将稍大一些。但是如果递归可以转换成循环,那又有什么关系呢?“…足够聪明的编译器…”Java真正的技术挑战是以一种不会破坏Java安全模型的方式实现尾部调用优化,等等@Stephen C,你能举个例子说明它与安全模型的关系吗?