我在思考当你试图捕捉StackOverflowError时会发生什么,并想出了以下方法:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
现在我的问题是:
为什么这个方法会打印出“4”?
我认为可能是因为System.out.println()
需要在调用堆栈上有3个段,但我不知道数字“3”从哪里来。当你查看System.out.println()
的源代码(和字节码)时,它通常会导致比3更多的方法调用(因此,在调用堆栈上有3个段将不足够)。如果是由于Hotspot VM应用了优化(方法内联),我想知道在另一个VM上结果是否会有所不同。
编辑:
由于输出似乎高度依赖于JVM,我使用Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)获得结果为4。
我为什么认为这个问题不同于理解Java堆栈的解释:
我的问题不是为什么有cnt > 0(显然是因为System.out.println()
需要堆栈大小,在打印之前抛出另一个StackOverflowError
),而是为什么它具有特定的值,如4、0、3、8、55或其他一些系统上的值。
5
、6
和38
。 - Kon