2016-03-07 70 views
6
public class Cloning { 

    Cloning c=new Cloning(); 
    public static void main(String[] args) { 

     Cloning c=new Cloning(); 
     c.print(); 
    } 

    public void print(){ 
     System.out.println("I am in print"); 
    } 

} 

在上面的代碼中我有一個簡單的類和一個類級別的實例,我也有一個同名的本地實例。當運行上面的代碼,我得到異常如下:爲什麼我在構造函數中得到一個StackOverflowError異常

Exception in thread "main" java.lang.StackOverflowError 
    at com.java8.Cloning.<init>(Cloning.java:6) 
+1

這看起來像是試圖實現一個Singleton模式。有很多方法可以做到這一點。搜索Java Singleton,你會發現很多例子。 –

+1

不錯的問問StackOverflow!你應該加上「無雙關語」;)。 – Astrogator

回答

23

你的主要方法創建一個Cloning實例(Cloning c=new Cloning();),這將導致實例變量cCloning c=new Cloning();),創建另一個Cloning實例的初始化,等...

你有一個無限的構造函數調用,導致StackOverflowError

在上面的代碼中,我有一個簡單的類和類級實例

你沒有一個一流水平的實例。你有一個實例級別的實例。如果你想有一個一流水平的情況下,改變

Cloning c=new Cloning(); 

static Cloning c=new Cloning(); 
+0

其實我認爲罪魁禍首就是在'main'之外創建非'static'克隆實例。 – Bathsheba

+2

@Bathsheba那麼,原始實例是由主要方法創建的。如果沒有這個實例化,沒有實例變量會被初始化,所以無限構造函數調用鏈不會啓動。我同意這個bug可能不是將實例變量聲明爲static(這似乎是OP想要的)。 – Eran

+0

哎呀。你是正確的,有一個upvote! – Bathsheba

7

您實例每Cloning構造時間類Cloning,這將導致對實例遞歸。

7

你不是故意要static Cloning c = new Cloning();mainc = new Cloning();main而不是寫?

否則,每次運行時您都會得到一個新的c實例,這將導致StackOverflowError

目前的創作Cloning c = new Cloning();當地c(其中陰影領域c)踢了整個事情掉。

相關問題