我想知道当你试图捕获StackOverflowError时会发生什么,并提出以下方法:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题:
为什么这个方法打印'4'?
我想也许是因为System.out.println()在调用堆栈上需要3个段,但我不知道3号来自哪里.当你查看源代码(和字节码)时System.out.println(),它通常会导致比3更多的方法调用(因此调用堆栈上的3个段是不够的).如果是因为优化热点VM应用(方法内联),我想知道其他VM上的结果是否会有所不同.
编辑:
由于输出似乎是高度JVM特定的,我使用
Java(TM)SE运行时环境(构建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或其他的其他东西系统.
我试图弄清楚try-catch-finallyin的执行顺序java.我认为执行顺序应该是
但我对以下结果感到困惑
public class TryCatchFinally {
static int i = 0;
public static void main(String[] args) {
try {
System.out.println(i++);
main(args);
} catch (StackOverflowError e) {
System.out.println("Catch");
} finally {
System.out.println("Finally");
}
}
}
Run Code Online (Sandbox Code Playgroud)
出局(出局的一部分)
9127
9128
9129
9130
CatcFCatch // what is the wrong here???
Finally
Finally // there are more Finally printed here.
Run Code Online (Sandbox Code Playgroud)
我的问题是这里真的发生了什么?
让我添加更多为什么它不打印"Catch"?
我在运行时得到了这个IntelliJ IDEA.但是当我跑进去的时候,我会terminal按照以下方式退出.
9151
9152
9153
9154CatchFinallyCatch
Finally
Finally
Finally
Finally
Run Code Online (Sandbox Code Playgroud)