为什么此方法打印4?
我想知道当您尝试捕获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(内部版本1.6.0_41-b02), Java HotSpot(TM)64位服务器VM(内部版本20.14-b01,混合模式)获得了结果4。 解释为什么我认为这个问题与理解Java堆栈不同: 我的问题不是关于为什么cnt> 0(显然是因为System.out.println()需要堆栈大小并且StackOverflowError在打印某些内容之前会抛出另一个),而是为什么它具有4的特定值,分别是0、3、8、55或其他值系统。