Java 运行程序时出错

Java 运行程序时出错,java,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; }

我有以下代码:

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;
        }
    }
}
public class ClassB {
    ClassB () {
        ClassA.main(null);
    }
}
ClassB.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;
        }
    }
}
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”中打印,但为什么会出现堆栈溢出错误?

在调用
ClassB()
后,您正在设置标志
isDone
。因此,出现了一个无限递归调用,当到达内存时,它会导致
stackoverflowerrror

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

如下图所示:

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

调用
ClassB()
后,您正在设置标志
isDone
。因此,出现了一个无限递归调用,当到达内存时,它会导致
stackoverflowerrror

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

如下图所示:

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

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

尝试从更改
if

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


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

尝试从更改
if

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


逻辑错误。谢谢:)逻辑错误。谢谢:)