相关疑难解决方法(0)

为什么这个方法打印4?

我想知道当你试图捕获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或其他的其他东西系统.

java stack-overflow jvm

111
推荐指数
5
解决办法
4310
查看次数

困惑于try-catch-finally问题?

我试图弄清楚try-catch-finallyin的执行顺序java.我认为执行顺序应该是

  1. 尝试
  2. catch(如果发生错误/捕获异常)
  3. 最后(无论是否被捕获)

但我对以下结果感到困惑

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)

java exception try-catch-finally

3
推荐指数
1
解决办法
160
查看次数

标签 统计

java ×2

exception ×1

jvm ×1

stack-overflow ×1

try-catch-finally ×1