【发布时间】:2018-09-01 15:21:01
【问题描述】:
我创建了一个递归程序来打印一条消息 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:
这里我需要关于错误的助手和一些关于递归的解释。
【问题讨论】:
-
任何递归方法都必须有终止条件。否则,它只会运行直到堆栈溢出。递归调用的期望终止条件是什么?
-
这不一定是真的。 OP 写的内容是初学者编写无限循环的一种非常自然的方式。与
while或for循环相比,它编写起来简单得多,理解起来也简单得多,并且使用的概念更少,并且不需要突变。而且由于它是尾调用,更具体地说,是尾递归调用,它应该在恒定空间中运行,实际上在许多编程语言(例如 Scala、Scheme、 Erlang、Haskell、Racket、F♯、ML)。实际上,问题在于 Java 没有正确的尾调用或至少没有正确的尾递归。 -
@JörgWMittag,虽然你说的是真的,但我在提出的 print “几次”问题中的陈述表明这不是试图编写一个无限循环。
标签: java recursion error-handling stack-overflow