我试图找出try-catch-finally
中java
的执行顺序。我认为执行顺序应该是
但我对以下
的结果感到困惑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
答案 0 :(得分:7)
您可能会在println
调用中遇到堆栈溢出错误某处(可能是因为正在进行某些刷新或类似事件),将println
方法保留在不一致的状态(打印了部分它应该是什么)。
当已经处理StackOverflowError
时很容易发生这种情况,因为此时你已经危险地接近溢出的堆栈了(因为你刚从一个堆栈中恢复过来)非常接近问题)。
我的解释看起来像这样:
StackOverflowError
,因为堆栈已满println
来电期间发生另一个StackOverflowError
catch
块已完成(突然)println
致电又发生了 StackOverflowError
StackOverflowError
main
Finally
,因为堆栈现在缩短了1个元素。答案 1 :(得分:1)
这是因为对main的递归调用。因此,当您在main中调用main时,您将多次输入try catch块,并且在第一次StackOverflow出现后您从它返回的次数与您输入的次数相同。这是多个财务的原因。
编辑:
当我看到一些downvotes,没有任何合理的解释,如果有人认为我错了,只需打印该死的i
计数器,并在最后一个块中减少。
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: "+ (i--));
}
}
答案 2 :(得分:0)
您使用的是IDE(日食或类似物),如果是,则可能是由于此原因。
以下是我尝试的结果 -
//代码
public static void main(String[] args) throws IOException {
File file = new File("resources/ouput.txt");
file.createNewFile();
PrintStream printStream = new PrintStream(file);
System.setOut(printStream);
overflowTester(0);
}
private static void overflowTester(int index) {
try {
System.out.println(index++);
overflowTester(index);
} catch (StackOverflowError e) {
System.out.println("Catch");
} finally {
System.out.println("Finally");
}
}
//输出
0
1
2
3
4
5
6
7
8
9
10
...
...
...
9666
Catch
Finally
...
...
Finally
注意:'9666'印在第9667行,最后一个终止于19336行。
就我而言,运行以下程序:
private static int index = 0;
public static void main(String[] args) throws IOException {
try {
System.out.println(index++);
main(args);
} catch (StackOverflowError e) {
System.out.println("Catch");
} finally {
System.out.println("Finally");
}
}
来自命令提示符的产生了类似的结果:
0
1
2
3
4
5
...
...
9667
Catch
Finally
...
...
Finally
在第9668行打印'9667',在19338行打印最后'最后'。