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