为什么此Java代码会产生堆栈溢出错误? [英] Why does this Java code create a stack overflow error?
问题描述
下面的代码在执行时会产生堆栈溢出错误.但是,如果删除
The code below produces a stack over flow error when it is executed. However If remove either of
-
静态最终GenerateStackOverflow E1 =新的GenerateStackOverflow("value1");
-
final GenerateStackOverflow E2 =新的GenerateStackOverflow("value2");
它运行时没有堆栈溢出错误.如果我有以上两行,但是如果只有这两行在类中,那么我怎么会出现堆栈溢出错误呢?
It runs without a stack over flow error. How come I get a stack overflow error if I have the above two lines but no error if only one of the lines is in the class?
public class GenerateStackOverflow {
private final String value;
static final GenerateStackOverflow E1 = new GenerateStackOverflow("value1");
final GenerateStackOverflow E2 = new GenerateStackOverflow("value2");
public GenerateStackOverflow(String value) {
System.out.println("GenerateStackOverflow.GenerateStackOverflow()");
this.value = value;
}
public String getValue() {
return value;
}
public static void main(String[] args) {
GenerateStackOverflow.class.getName();
}
}
推荐答案
两个都需要生成 StackOverflowError
.当您添加以下行时:
Both are needed to generate a StackOverflowError
. When you include this line:
static final GenerateStackOverflow E1 = new GenerateStackOverflow("value1");
首次访问该类时,会创建 GenerateStackOverflow
的实例.
An instance of GenerateStackOverflow
is created when the class if first accessed.
不包括此行:
final GenerateStackOverflow E2 = new GenerateStackOverflow("value2");
一切都很好.但是这条线很关键.每次创建 GenerateStackOverflow
的实例时,它都会尝试初始化其成员变量 E2
-另一个 GenerateStackOverflow
对象.然后那个实例将把其 E2
初始化为另一个 GenerateStackOverflow
对象.这一直持续到发生 StackOverflowError
.
things are fine. But this line is critical. Each time an instance of GenerateStackOverflow
is created, it attempts to initialize its member variable E2
-- another GenerateStackOverflow
object. Then that instance will have its E2
initialized to another GenerateStackOverflow
object. This continues until a StackOverflowError
occurs.
如果包括第二行但不包括第二行,则不会创建任何实例,并且永远不会输入无限递归.
If the second line is included but the first isn't, then no instance is created and the infinite recursion is never entered.
这篇关于为什么此Java代码会产生堆栈溢出错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!