2012-10-24 57 views
0

以下代碼段中的代碼將引發java.lang.StackOverflowError由相同類型的非靜態成員導致的StackOverflowError

public class Main 
{ 
    private Main m=new Main(""); //This statement causes the exception. 

    private Main(String s) 
    { 
     System.out.println(s); 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      Main m1=new Main("The constructor called."); 
      System.out.println("Successful!"); 
     } 
     catch (Exception ex) 
     { 
      System.out.println(ex); 
     } 
    } 
} 

沒有意義刻意寫這篇聲明private Main m=new Main("");類本身內部,但這種說法是不是永遠應該由類中的任何代碼中使用那麼說明如何能導致引發異常?

回答

4

每次調用構造函數時,您創建一個實例,從而執行初始化代碼

private Main m=new Main(""); 

它調用構造函數等

你可能想

private static Main m=new Main(""); 

爲了保持單身。

1

你的程序導致堆棧溢出是絕對正常的...... 編譯器不檢查你的成員m是否在你的代碼中被使用,雖然你是對的它可能已經做到了,可能帶有副作用:對象未被構建... 爲了構建主對象,還必須構造另一個主對象(私人主要成員)......它給出無限遞歸,因此堆棧過度流動

+0

「*雞來首先在雞蛋前。*「 - 哈哈。 – Tiny