2013-11-02 86 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(); 
    }