编程语言
首页 > 编程语言> > java – 与try-catch-finally问题混淆?

java – 与try-catch-finally问题混淆?

作者:互联网

参见英文答案 > Confusing output from infinite recursion within try-catch                                    7个
我试图在java中找出try-catch-finally的执行顺序.我认为执行顺序应该是

>试试
> catch(如果发生错误/捕获异常)
>最后(无论是否被捕获)

但我对以下结果感到困惑

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");
    }
 }
}

出局(出局的一部分)

9127
9128
9129
9130
CatcFCatch // what is the wrong here???
Finally
Finally // there are more Finally printed here.

我的问题是这里真的发生了什么?

让我添加更多为什么它不打印“Catch”???

当我在IntelliJ IDEA中运行时,我得到了这个.但是当我在终端跑步时,我会按照以下方式退出.

9151
9152
9153
9154CatchFinallyCatch
Finally
Finally
Finally
Finally

解决方法:

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

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

我的解释看起来像这样:

>主要递归调用很多…
>你递归第9130次称为main
>它打印那个号码
>它自称为第9131次
>它尝试打印该数字,但抛出StackOverflowError,因为堆栈已满
>你进入捕获并尝试打印“Catch”
>在println调用期间发生另一个StackOverflowError
>执行finally块,因为catch块已完成(突然)
>它试图打印“最后”
>在println调用期间,又发生了另一个StackOverflowError
>在第9130次调用main时捕获到StackOverflowError
>它打印“Catch”(成功,因为堆栈现在缩短1个元素!)
>执行finally块并最终成功打印,因为堆栈现在缩短了1个元素.
>更多finally块执行.

标签:try-catch-finally,java,exception
来源: https://codeday.me/bug/20190725/1532543.html