首页 > 解决方案 > 递归程序有一个带有示例方法的 StackOverflowError

问题描述

我创建了一个递归程序来多次打印一条消息 Hello,但在编译中出现 StackOverflowError 失败。

package com.recre;

public class Recursionhello {
    static void p() {
        System.out.println("Hello");
    p();
}

public static void main(String[] args) {
    p();
    }
}

它多次打印输出“Hello”,然后打印以下错误消息。

输出 -

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Exception in thread "main" java.lang.StackOverflowError
 at java.io.FileOutputStream.write(Unknown Source)
 at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
 at java.io.BufferedOutputStream.flush(Unknown Source)
 at java.io.PrintStream.write(Unknown Source)
 at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
 at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
 at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source)
 at java.io.OutputStreamWriter.flushBuffer(Unknown Source)
 at java.io.PrintStream.write(Unknown Source)
 at java.io.PrintStream.print(Unknown Source)
 at java.io.PrintStream.println(Unknown Source)
 at com.recre.Recursionhello.p(Recursionhello.java:5)
 at com.recre.Recursionhello.p(Recursionhello.java:6)
 at com.recre.Recursionhello.p(Recursionhello.java:6)
 at com.recre.Recursionhello.p(Recursionhello.java:6)
 at com.recre.Recursionhello.p(Recursionhello.java:6)
 at com.recre.Recursionhello.p(Recursionhello.java:6)
 at com.recre.Recursionhello.p(Recursionhello.java:6)
 at com.recre.Recursionhello.p(Recursionhello.java:

在这里我需要关于错误的助手和关于递归的一些解释。

标签: javarecursionerror-handlingstack-overflow

解决方案


基本上,递归是一种方法调用自身产生循环的方式。任何循环都需要一个条件来终止。在这种情况下,您错过了终止此循环的条件。关于堆栈溢出错误,当您调用一个方法时,它会加载到堆栈上,并且堆栈限制为 256 KB。每个方法调用都会消耗堆栈上的一些内存,当堆栈的大小已满时,我们再次尝试通过调用自身在堆栈上加载另一个方法,我们会得到 StackOverflowError。


推荐阅读