对不起,可能是一个愚蠢的问题,我是Java的新手。
有没有办法在Java中进行无休止的递归,像somithing:
public void sillyMethod()
{
System.out.println(i);
i++;
sillyMethod();
}
它抛出StackOverflowError,但我真的想要无休止地运行它。有没有办法实现呢?
谢谢!
答案 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等功能性的),你可以这样做,因为它在内部将它变成一个循环。