java - 递归程序有一个带有示例方法的 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:
在这里我需要关于错误的助手和关于递归的一些解释。
解决方案
基本上,递归是一种方法调用自身产生循环的方式。任何循环都需要一个条件来终止。在这种情况下,您错过了终止此循环的条件。关于堆栈溢出错误,当您调用一个方法时,它会加载到堆栈上,并且堆栈限制为 256 KB。每个方法调用都会消耗堆栈上的一些内存,当堆栈的大小已满时,我们再次尝试通过调用自身在堆栈上加载另一个方法,我们会得到 StackOverflowError。
推荐阅读
- javascript - 如何正确地将 JS 日期发送到 EF Core5 并返回?
- mapbox - 如何在mapbox中为不同的数据集设置不同的标记
- flutter - 调试颤振:如何强制 VSCode 每次都询问设备?
- swift - 有没有办法用 withAnimation(...?
- pentaho - 如何查看 pentaho 作业中的列表结果?
- node.js - 尝试运行机器人时出现弃用/UnhandledPromiseRejection 警告
- asp.net-core - C# razor 应用程序中是否可以有多个布局页面?
- r - 将 any() 与 dbplyr 一起用于 R 中的分组数据库查询
- angular - 角度测试 - 类型错误:无法读取underfined的属性
- python-3.x - 如何在 Python 中将特殊字符转换为 Unicode 转义序列