2013-11-02 39 views
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

在致电ClassB()之后,您正在设置国旗isDone。所以有一个无限的递归调用发生,当达到内存时导致StackOverFlowError

设置标志(isDone),然后致电ClassB();

如下图所示:

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

逻辑错误。谢谢 :) –

2

你在你的代码中的无限方法调用链所造成的StackOverflowError。这是因为您正在调用ClassB的构造函数ClassA的主要方法。主方法中的if块永远不会完成。代码中的逻辑错误是在创建ClassB实例后设置标志(isDone),而不是在此之前进行。

尝试从

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

改变if

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