当前位置: 首页 > 面试题库 >

最后尝试块可以防止StackOverflowError

常炯
2023-03-14
问题内容

看一下以下两种方法:

public static void foo() {
    try {
        foo();
    } finally {
        foo();
    }
}

public static void bar() {
    bar();
}

bar()清楚地运行会导致StackOverflowError,但foo()不会运行(该程序似乎无限期地运行)。 这是为什么?


问题答案:

它不会永远运行。每次堆栈溢出都会导致代码移至finally块。问题在于这将需要非常,非常长的时间。时间顺序为O(2 ^ N),其中N是最大堆栈深度。

想象最大深度为5

foo() calls
    foo() calls
       foo() calls
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()
       finally
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()
    finally calls
       foo() calls
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()
       finally
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()
finally calls
    foo() calls
       foo() calls
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()
       finally
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()
    finally calls
       foo() calls
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()
       finally
           foo() calls
              foo() which fails to call foo()
           finally calls
              foo() which fails to call foo()

要使每个级别进入finally块都需要两倍的时间,而堆栈深度可能是10,000或更大。如果您每秒可以进行10,000,000次呼叫,那么这将花费10 ^
3003秒,甚至比宇宙的时间还要长。



 类似资料:
  • 问题内容: 当try块中存在时,我对try- finally执行感到困惑。据我了解,finally块将始终执行,即在返回调用方法之前。在考虑以下简单代码时: 实际打印的结果为1。这是否意味着不执行finally块?有人可以帮我吗? 问题答案: 从块返回时,返回值存储在该方法的堆栈帧中。之后,将执行finally块。 更改finally块中的值不会更改堆栈中已存在的值。但是,如果您从finally块

  • 运行显然会导致,但运行不会(程序似乎只是无限期运行)。这是为什么?

  • 问题内容: 我想在finally块中关闭流,但是它抛出一个,因此看来我必须在块中嵌套另一个块才能关闭流。这是正确的方法吗?似乎有点笨拙。 这是代码: 问题答案: 似乎有点笨拙。 它是。至少java7尝试使用资源可以解决该问题。 在java7之前,您可以创建一个吞咽它的函数: 或将try …最终放入try catch中: 它比较冗长,并且finally中的异常会在try中隐藏一个,但从语义上讲它更接

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 我有一个python脚本正在查询共享Linux主机上的MySQL服务器。出于某种原因,对MySQL的查询通常会返回“服务器已消失”错误: 如果此后立即再次尝试查询,通常会成功。因此,我想知道python中是否有一种明智的方法来尝试执行查询,如果失败,则可以重试固定次数的尝试。可能我想让它尝试5次再完全放弃。 这是我的代码类型: 显然,我可以通过在except子句中进行另一次尝试来做到这

  • 这个现在的情况是没有HC了,据说是要等一段时间(一个月不等),换部门感觉也不太靠谱,所以退回本行了。 最终篇有还是没有这个看情况吧…… 主管面试(半小时)没有问到技术,常规的价值观问题和了解性对话,考研情况,加班看法,华为价值观,最有成就感的事,最沮丧的事,讨厌的人,有没有女朋友,平时运动,职业规划…… 确实累了,前后两个多月了。因为可能是最后了,也就是告一段落的末尾了,所以还是想说一说…… 前面