我的代码如下:
ClassA.java
public class ClassA {
static boolean isDone = false;
public static void main(String[] args) {
System.out.println("In class A.");
if (!isDone) {
new ClassB();
isDone = true;
}
}
}
ClassB.java
public class ClassB {
ClassB () {
ClassA.main(null);
}
}
运行程序时,我得到以下输出:
In class A.
In class A.
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.SingleByte.withResult(Unknown Source)
at sun.nio.cs.SingleByte.access$000(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeArrayLoop(Unknown Source)
at sun.nio.cs.SingleByte$Encoder.encodeLoop(Unknown Source)
at java.nio.charset.CharsetEncoder.encode(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
打印“在A级”。正如预期的那样,但为什么我会出现堆栈溢出错误?
答案 0 :(得分:4)
您在调用isDone
后设置了标记ClassB()
。所以有一个无限的递归调用发生,当达到内存时会导致StackOverFlowError
。
在调用isDone
之前设置标记(ClassB();
)。
如下图所示:
if (!isDone) {
isDone = true;
new ClassB();
}
答案 1 :(得分:2)
您的代码中有一个无限的方法调用链,导致StackOverflowError。这是因为您从ClassA
的构造函数调用ClassB
的主方法。主方法中的if块永远不会完成。代码中的逻辑错误是在创建isDone
实例后设置标志(ClassB
),而不是在此之前执行此操作。
尝试从
更改if
块
if (!isDone) {
new ClassB();
isDone = true;
}
到
if (!isDone) {
isDone = true;
new ClassB();
}