Java 运行程序时出错
我有以下代码: ClassA.javaJava 运行程序时出错,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; }
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;
}
到
逻辑错误。谢谢:)逻辑错误。谢谢:)