我正在试验这段代码,以准确了解StackOverflowError何时发生以及它是如何运行的。
private static int testFunc(int i) {
return i+1;
}
private static int add(int a){
try {
a = add(a);
} catch(StackOverflowError e){
System.out.println("StackOverflowError");
return ++a;
}
return ++a;
}
public static void main(String[] args) throws Exception {
char c = 'A';
System.out.println((char)testFunc(c));
int a = 0;
System.out.println(add(a));
}当我尝试执行这段代码时,我期望递归在发生StackOverflowError时停止,并且输出的值比可用堆栈的深度多一个。但是StackOverflowError被抓了好几次。我把StackOverflowErrorStackOverflowErrorStackOverflowError....印了11次。虽然我使用了System.out.println()语句,但所有内容都打印在一行上。输出值为0。它只印了一次。
另外,当我在catch块中包含一个Thread.sleep(1000);语句时,为了确定为什么得到如此奇怪的输出,我得到了一个更奇怪的输出。catch块中的print语句执行了几次。也许超过100,我没有一个确切的数字。在这里,在最初的几个print语句执行中(最初的7-8次执行),所有内容都打印在同一行上,之后,所有内容都打印在新行上。但是总的等待时间是1秒(由于1000 to的睡眠时间),并且输出仍然是0。
为什么我会得到这样的输出,为什么StackOverflowError会以这种方式工作?
更新:我刚刚意识到我的原始代码上还有几行代码,这就产生了这种行为。更新了密码。这是我在没有Thread.sleep(1000)语句的情况下得到的实际输出。
B
stackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowError
0更新2:我使用了预增量运算符,而不是后置增量运算符,现在我得到了堆栈深度的适当输出。但是,如果删除对testFunc()的调用,则在打印堆栈深度之前只打印StackOverflowError语句一次。但如果我接到这些电话,就会被打印好几次。为什么是这样?
发布于 2018-04-23 10:28:25
为什么多次打印
System.out.println("StackOverflowError");将在内部调用其他方法,这将导致抛出另一个StackOverflowError。这在打印"StackOverflowError“之后,但在打印新行之前发生。
为什么有时只有一个打印
上面的解释有点简单。实际上,这实际上取决于第一个StackOverflowError被捕获后堆栈中还剩下多少大小。根据启动递归时堆栈上的初始空间以及每个递归添加到堆栈的数据量,println()的行为将有所不同:
println():
println():
然后,这将重复执行,直到递归深入到可以毫无例外地调用println()为止。因此,您可以有3种不同的输出:
在每一种情况下,您可能会得到比控制台中出现的"StackOverflowError“更多的异常。
你得到的结果完全是未知数。
为什么0
因为使用post增量运算符,所以始终返回0。
https://stackoverflow.com/questions/49978586
复制相似问题