Java无休止的递归和StackOverflowError

时间:2011-01-31 21:51:47

标签: java recursion stack-overflow

对不起,可能是一个愚蠢的问题,我是Java的新手。

有没有办法在Java中进行无休止的递归,像somithing:

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

}

它抛出StackOverflowError,但我真的想要无休止地运行它。有没有办法实现呢?

谢谢!

4 个答案:

答案 0 :(得分:4)

是和否,(但大部分都没有!:)

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

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


一个相关的问题是,"Does the JVM support tail-call optimization."这个问题的答案是,“不,不是现在,但不排除未来的版本。”

答案 1 :(得分:1)

正如上面的其他人所说,无限递归最终会导致堆栈溢出,至少就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();
}

}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用Java,你无法做到这一点。但是,语言中的尾部调用优化(尤其是Ocaml等功能性的),你可以这样做,因为它在内部将它变成一个循环。