运行程序时出错

时间:2013-11-02 09:47:50

标签: java

我的代码如下:

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

2 个答案:

答案 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();
  }