2009-06-30 7 views
0

Je suis en train de faire une classe en Java qui construit un objet de type Action qui détient trois ints et il retourne à mon autre classe dans le tableau history, où history est un tableau de tapez Action. Quand on l'appelle, j'obtiens immédiatement une boucle sans fin; d'où le débordement de la pile.erreur Stackoverflow - instanciation ma classe d'objet

erreur - j'ai imprimé 1 ligne, il se poursuit ...

Exception in thread "main" java.lang.StackOverflowError 
    at sudokugame.Action.<init>(Action.java:7) 

Classe:

public class Action { 

    Action a; 
    public Action(int i, int o, int p){ 
     a = new Action(i,o,p); 
    } 

    public void setAction(int n, int b, int c){ 

    } 

    public Action getAction(){ 
     return a; 
    } 
} 

Répondre

12

Votre constructeur appelle lui-même récursive pour toujours. Un moyen sûr de déborder une pile :)

public Action(int i, int o, int p){ 
    //why do you do this? 
    a = new Action(i,o,p); 
} 

Peut-être ce que tu voulais vraiment faire était tout simplement stocker i, o et p dans l'instance de classe?

public class Action { 

    int i; 
    int o; 
    int p; 

    public Action(int i, int o, int p){ 
    this.i = i; 
    this.o = o; 
    this.p = p; 
    } 

    ... 
} 

(edit: voir other answer par exemple plus complet)

0

Votre instancier la classe elle-même.

+0

Pourquoi cela serait-il un problème? La récursion est le problème ici. –

2

Le problème est ici:

a = new Action(i,o,p); 

Vous invoquez à nouveau le constructeur d'une nouvelle instance dans le constructeur de la classe elle-même. Puisque chaque appel suivant au constructeur va créer un nouvel appel de constructeur, il n'y a aucun moyen pour la pile de se dérouler, créant ainsi un débordement de pile.

0

Votre classe Action a-t-elle vraiment besoin de conserver une référence à une autre action?

Action a; 

Plus précisément, cette ligne est-elle nécessaire? Pour quoi l'utilisez-vous?

3

Essayez de le faire de cette façon:

public class Action { 

    int i; 
    int o; 
    int p; 

    public Action(int i, int o, int p){ 
    this.i = i; 
    this.o = o; 
    this.p = p; 
    } 

    public void setAction(int n, int b, int c){ 
    this.i = i; 
    this.o = o; 
    this.p = p; 
    } 

    public Action getAction(){ 
    return this; 
    } 
} 
0

que votre constructeur a appel récursif.

0

Le Command design pattern est une façon d'aborder une situation où vous voulez avoir une histoire des actions entreprises afin qu'ils puissent être défaits, etc.

0

ont Constructor appel récursif.