【发布时间】:2013-11-06 10:03:32
【问题描述】:
我试图找出try-catch-finally 在java 中的执行顺序。我认为执行顺序应该是
- 试试
- catch(如果发生错误/捕获异常)
- finally(无论是否捕获到异常)
但我对以下结果感到困惑
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 中运行它时,我得到了这个。但是当我在terminal 中运行时,我的输出如下。
9151
9152
9153
9154CatchFinallyCatch
Finally
Finally
Finally
Finally
【问题讨论】:
-
@MarounMaroun 是的,但我想弄清楚这里到底发生了什么?
-
您会打印出一堆“Finally”,因为当您完成执行每个递归调用时,堆栈会被解压并且所有 finally 块都会被执行。至于奇怪的“CatcFCatch”,我不确定,但我怀疑这可能是因为
System.out.println在堆栈底部调用时导致更多StackOverflowError在更高的递归调用中被捕获。 -
This 可能会回答您的问题。
-
@Maroun - 有趣的是,您链接到的问题是由同一个人提出的。
-
@Ruchira:这与您在 8 月份提出的问题差不多相同(由 Maroun Maroun 链接)。
标签: java exception try-catch-finally