2016-03-07 14 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"); 
    } 

} 

Nel codice precedente ho una classe semplice e un'istanza di livello di classe, ho anche un'istanza locale con lo stesso nome. Quando si esegue il codice di cui sopra ho seguito eccezione:Perché ottengo un'eccezione StackOverflowError nel mio costruttore

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

Sembra un tentativo di implementare un modello Singleton. Ci sono diversi modi per farlo. Fai una ricerca di Java Singleton e troverai molti esempi. –

+1

Q bello da chiedere su StackOverflow! Dovresti aggiungere "no pun intended";). – Astrogator

risposta

23

il principale metodo crea un'istanza Cloning (Cloning c=new Cloning();), che causa l'inizializzazione della variabile di istanza c (Cloning c=new Cloning();), che crea un altro Cloning esempio, e così via ...

Si dispone di una catena infinita di chiamate del costruttore, che porta a StackOverflowError.

Nel codice sopra ho una semplice classe e un'istanza livello di classe

Non è un'istanza di livello di classe. Hai un'istanza di livello istanza. Se volete un esempio livello di classe, cambiare

Cloning c=new Cloning(); 

a

static Cloning c=new Cloning(); 
+0

In realtà io * penso * il colpevole è la creazione dell'istanza non-'statica' 'Clonazione' al di fuori di' main'. – Bathsheba

+2

@Bathsheba Bene, l'istanza originale viene creata dal metodo principale. Senza questa istanza, nessuna variabile di istanza sarebbe stata inizializzata, quindi la catena di chiamate al costruttore infinito non sarebbe iniziata. Sono d'accordo che probabilmente il bug non sta dichiarando la variabile di istanza come statica (che sembra essere ciò che l'OP voleva). – Eran

+0

IOops. Hai ragione, hai un upvote! – Bathsheba

7

si crea un'istanza della classe Cloning ogni volta Cloning è costruito, che provoca una ricorsione su istanze.

7

non Forse intendevi scrivere static Cloning c = new Cloning();fuorimain, oc = new Cloning();entromain invece?

In caso contrario, riceverai una nuova istanza di c ogni volta che viene eseguita, che causerà un StackOverflowError.

Attualmente la creazione del locale c in Cloning c = new Cloning(); (che ombre il campo c) calcia il tutto spento.

Problemi correlati