繁体   English   中英

StackOverflowError发生多次

[英]StackOverflowError occurs multiple times

我正在尝试这段代码,以准确了解何时发生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。仅打印了一次。

另外,当我包含Thread.sleep(1000); 在catch块中的语句,以确定为什么我得到了如此奇怪的输出,我得到了一个更奇怪的输出。 catch块中的print语句已执行了几次。 也许超过100,我没有确切的数字。 在这里,在前几个print语句执行(前7-8个执行)中,所有内容都打印在同一行上,之后所有内容都打印在新行上。 但是总的等待时间是一秒钟(由于1000ms的睡眠时间),输出仍然为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() 因此,您可以有3种不同的输出:

  • 其中一个“ StackOverflowError”带有新行,
  • 用一个新行显示多个“ StackOverflowError”,
  • 带有多个新行的多个“ StackOverflowError”。

在每种情况下,与在控制台中出现的“ StackOverflowError”相比,您获得的异常可能更多。

您完全不确定哪个结果。

为什么0

因为您使用后递增运算符,所以您总是返回0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM