gpt4 book ai didi

java - StackOverflowError 发生多次

转载 作者:行者123 更新时间:2023-11-30 06:44:54 26 4
gpt4 key购买 nike

我正在尝试这段代码以准确了解 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 发生时停止并且打印的值比可用堆栈的深度多 1。但是 StackOverflowError 被多次捕获。我打印了大约 11 次 StackOverflowErrorStackOverflowErrorStackOverflowError....。尽管我使用了 System.out.println() 语句,但所有内容都打印在一行中。并且打印的输出为 0。它只打印了一次。

此外,当我在 catch block 中包含一个 Thread.sleep(1000); 语句来确定为什么我得到如此奇怪的输出时,我得到了一个更奇怪的输出。 catch block 中的 print 语句被执行了多次。可能超过100个,我没有确切的数字。在这里,在前几次打印语句执行中(前 7-8 次执行),所有内容都打印在同一行上,之后所有内容都打印在新行上。但整体等待时间为一秒(由于 1000 毫秒 hibernate 时间),输出仍然为 0。

为什么我会得到这样的输出,为什么 StackOverflowError 会以这种方式工作?

更新:我刚刚意识到我的原始代码中多了几行,这导致了这种行为。更新了代码。这是我在没有 Thread.sleep(1000) 语句的情况下得到的实际输出。

B
stackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowError
0

更新 2:我使用了预增量运算符而不是后增量运算符,现在我得到了正确的堆栈深度输出。但是,如果我删除对 testFunc() 的调用,则 StackOverflowError 语句仅在打印堆栈深度之前打印一次。但如果我有这些电话,它会被打印多次。为什么会这样?

最佳答案

为什么要多次打印

System.out.println("StackOverflowError"); 会在内部调用其他方法,这会引发另一个 StackOverflowError 被抛出。这发生在打印“StackOverflowError”之后,但在打印新行之前。

为什么有时只打印一张

上面的解释有点简化。实际上,这实际上取决于在捕获到第一个 StackOverflowError 后堆栈中剩余的大小。根据开始递归时堆栈上剩余的初始空间,以及每次递归添加到堆栈的数据量,println() 的行为会有所不同:

  • 如果堆栈上有足够的空间来调用 println():
    • 您将在您的控制台中得到一个“StackOverflowError”。
  • 如果堆栈上没有足够的空间来调用 println():
    • 在打印“StackOverflowError”之前调用将抛出,
    • 或者调用将在打印“StackOverflowError”之后但在打印新行之前抛出,
    • 或者调用将在“StackOverflowError”之后抛出并打印新行。

然后这将重复,直到您在递归中足够远,以便 println() 被无一异常(exception)地调用。所以你可以有 3 种不同的输出:

  • 一个换行的“StackOverflowError”,
  • 多个“StackOverflowError”换行,
  • 带有多个新行的多个“StackOverflowError”。

在每种情况下,您得到的异常可能都比控制台中出现的“StackOverflowError”要多。

你得到的结果是完全不确定的。

为什么是 0

因为你使用了后增量运算符,所以你总是返回 0。

关于java - StackOverflowError 发生多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49978586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com