0

我有以下代码:

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 类”。正如预期的那样,但为什么我得到堆栈溢出错误?

4

2 回答 2

4

isDone在调用后设置标志ClassB()。因此发生了无限递归调用,这导致StackOverFlowError何时达到内存。

在调用之前设置标志 ( isDone) ClassB();

如下所示:

if (!isDone) {
    isDone = true;
    new ClassB();
}
于 2013-11-02T09:48:14.023 回答
2

您的代码中有一个导致 StackOverflowError 的无限方法调用链。这是因为您正在ClassA从 的构造函数调用 main 方法ClassB。main 方法中的 if 块永远不会完成。代码中的逻辑错误是在isDone创建ClassB实例之后设置 flag(),而不是在此之前设置。

尝试将if块从

 if (!isDone) {
         new ClassB();
         isDone = true;
  }

 if (!isDone) {
         isDone = true;
         new ClassB();
  }
于 2013-11-02T09:52:34.620 回答