首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackOverflowError多次发生

StackOverflowError多次发生
EN

Stack Overflow用户
提问于 2018-04-23 10:15:37
回答 1查看 112关注 0票数 2

我正在试验这段代码,以准确了解StackOverflowError何时发生以及它是如何运行的。

代码语言:javascript
复制
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)语句的情况下得到的实际输出。

代码语言:javascript
复制
B
stackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowError
0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-23 10:28:25

为什么多次打印

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

为什么有时只有一个打印

上面的解释有点简单。实际上,这实际上取决于第一个StackOverflowError被捕获后堆栈中还剩下多少大小。根据启动递归时堆栈上的初始空间以及每个递归添加到堆栈的数据量,println()的行为将有所不同:

  • 如果堆栈上有足够的空间调用println()
    • 您将在您的控制台中得到一个"StackOverflowError“。

  • 如果堆栈上没有足够的空间调用println()
    • 要么在"StackOverflowError“被打印之前就抛出电话,
    • 或者在打印"StackOverflowError“之后,但是在打印新行之前,调用会抛出,
    • 或者调用在"StackOverflowError“之后抛出,新行被打印出来。

然后,这将重复执行,直到递归深入到可以毫无例外地调用println()为止。因此,您可以有3种不同的输出:

  • 一个有新行的"StackOverflowError“,
  • 一个新行的多个"StackOverflowError“,
  • 多个"StackOverflowError“和多个新行。

在每一种情况下,您可能会得到比控制台中出现的"StackOverflowError“更多的异常。

你得到的结果完全是未知数。

为什么0

因为使用post增量运算符,所以始终返回0。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49978586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档