当前位置: 首页 > 知识库问答 >
问题:

为什么它不以堆栈溢出错误终止?[副本]

朱起运
2023-03-14
public class Workout {

    public static void main(String[] args) {
        workHard();
        System.out.println("It’s nap time.");
    }

    private static void workHard() {
        try {
            workHard();
        } finally {
            workHard();
        }
    }
}

共有1个答案

单于旭东
2023-03-14

让我们在堆栈级别1、2、3依次将堆栈的底部索引为0和后续调用(因为它是递归的)。每次调用workHard将使堆栈索引增加1,而每次返回将使堆栈长度减少1。

由于没有任何return语句,这段代码形成了一个无限递归,而摆脱这个递归循环的唯一方法是一个打破这个循环的堆栈溢出异常。

不考虑try/finally的修改代码:

public class Workout {

    public static void main(String[] args) {
        workHard();
        System.out.println("It’s nap time.");
    }

    private static void workHard() {
        workHard();
    }
}
public class Workout {

    public static void main(String[] args) {
        workHard();
        System.out.println("It’s nap time.");
    }

    private static void workHard() {
        try {
            workHard();
        } finally {
            workHard();
        }
    }
}

现在我们在第n个堆栈级别获得stack overflowexception。执行转到finally块,它再次抛出一个异常,并且该异常在finally块的第n-1级接收。由于没有任何方法来处理异常,因此异常被抛出到第n-2个堆栈级别,该级别捕获异常并重新触发递归。

注意,到现在我们已经释放了两个堆栈级别。

现在,递归级再次到达第n级,控制返回到第n-3级,再次到达第n级,返回到第n-4级,依此类推。

在某个时候,我们会到达第0个堆栈级别的finally块,然后在最后抛出异常给main方法之前,通过try和finally块再次到达第n个级别。

堆栈一次又一次地被释放和占用,因此产生了许多溢出异常和终止时间。

来到第二部,会不会影响其他节目?

 类似资料:
  • 令我惊讶的是,即使在Java中发生了StackOverflowerError之后,仍然可以继续执行。 我知道StackOverflowerError是类错误的子类。类错误被描述为“Throwable的一个子类,表示合理的应用程序不应试图捕捉的严重问题。” 这听起来更像是一个建议而不是规则,补充说捕获像StackOverflow Error这样的错误实际上是允许的,这取决于程序员不这样做的合理性。看

  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 问题内容: 我到处都是,找不到可靠的答案。根据文档,在以下情况下,Java引发java.lang.StackOverflowError错误: 由于应用程序递归过深而在堆栈溢出时抛出。 但这提出了两个问题: 不仅通过递归,还有其他方法可以使堆栈溢出吗? 是在JVM实际溢出堆栈之前还是之后发生StackOverflowError? 详细阐述第二个问题: 当Java引发StackOverflowErro

  • 我有一个类 Delete 我想使用 Gson 库将其转换为 json,但是当我转换它时,它会抛出 这是我的类 这里是枚举类DeleteStatus.scala 删除原因.scala 以下是我如何在Json转换 但它抛出以下异常 请帮助其中的错误

  • 问题内容: 下面的代码在执行时会产生堆栈溢出错误。但是,如果删除其中一个 它运行时没有堆栈溢出错误。如果我有以上两行,而类中只有其中一行,则没有错误,怎么会出现堆栈溢出错误呢? 问题答案: 两者都需要生成一个。当包含此行时: 首次访问该类时,将创建的实例。 不包括此行: 一切都很好。但是这条线很关键。每次创建的实例时,它都会尝试初始化其成员变量-另一个对象。然后, 该 实例将 其 初始化为另一个对

  • 问题内容: 我的第一段代码是我的项目对象文件;第二个是主班。在运行代码没有任何问题之前,但是在添加读写文件之后,我的代码开始收到堆栈流错误。只是正在调用错误的代码段。 我的主班: 如何找到导致堆栈溢出的地方? 问题答案: 创建: 并创造 因此,在初始化时,您将不断创建这些对象 有一个类似的Baeldung示例,用于获取StackOverflowError 由于ClassOne的构造函数实例化了Cl