我在the Javagony article on esolangs.org中发现了这个代码块:
...在Javagony中,复制循环的最常见方式是通过递归.如果你的循环有太多的步骤,你会得到一个堆栈溢出错误,然而,这是可以捕获的.因此,要创建循环,我们可以从调用自身的函数开始,并try 捕获.
public void loop() { try { loop(); catch (StackOverflowException /* sic */ e) { loop(); } }
好的,我知道你should not"抓住"了StackOverflowError
,因为我面前的许多问题已经结束了;但我不禁好奇,如果你只是试图抓住它,could会发生什么?它会给你无限的递归,还是JVM会崩溃和爆炸?
不管怎么说,我是这样写的:
public class Javagony
{
public static void main(String[] args)
{
loop();
}
static int n = 1;
public static void loop()
{
System.out.println(n);
n++;
try
{
loop();
}
catch (StackOverflowError _e)
{
loop();
}
}
}
然后我用java Javagony.java
来计算它.从那时起已经有一段时间了,数字一直在滚动.它现在已经达到4072342(相比之下,没有Try Catch块的同一个程序在~40000年年死亡),并且仍在继续.但这怎么可能发生呢?StackOverflowError
不是表示资源已经耗尽,函数调用的最大容量已经达到了吗?为什么简单地捕捉和忽略它会使递归继续进行?
PS.进程已中断,请不要担心