困惑于try-catch-finally问题?

Ruc*_*era 3 java exception 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)

Joa*_*uer 7

有可能你在调用中的某个地方出现了stackoverflow错误println(可能是因为某些刷新正在进行或类似的事情),使println方法处于不一致的状态(打印部分应该是什么).

当你已经在处理a 时很容易发生这种情况StackOverflowError,因为此时你已经危险地接近溢出的堆栈(因为你刚从一个非常接近问题的点恢复).

我的解释看起来像这样:

  • 主要递归调用很多...
  • 你递归第9130次称为main
  • 它打印那个号码
  • 它称之为第9131次
  • 它会尝试打印该数字,但会抛出一个StackOverflowError,因为堆栈已满
  • 你输入了捕获并尝试打印"Catch"
  • 在那个println电话中,另一个StackOverflowError发生
  • 执行finally块,因为catch块已完成(突然)
  • 它试图打印"最后"
  • 那个 println电话中 StackOverflowError发生了另一次
  • StackOverflowError是在第9130次调用中发现的main
  • 它打印"Catch"(成功,因为堆栈现在缩短1个元素!)
  • 执行finally块并Finally成功打印,因为堆栈现在缩短了1个元素.
  • 更多最后块执行.