2009-06-30 17 views
0

ich eine Klasse in Java zu machen versuchen, die ein Objekt vom Typ baut Action die drei Ints hält und gibt sich an meine anderen Klasse im Array history, wo history ist ein Array von Geben Sie Action ein. Wenn es angerufen wird, bekomme ich sofort eine Endlosschleife; daher der Stapelüberlauf.Stackoverflow-Fehler - aus meiner Objektklasse instanziieren

Fehler - ich gedruckt 1 Zeile, es geht weiter ...

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

Klasse:

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; 
    } 
} 

Antwort

12

Ihr Konstruktor nennt sich immer rekursiv. Ein sicherer Weg, um einen Stack zu überlaufen :)

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

Vielleicht was Sie wirklich wollten, war nur speichern ich, o und p in der Klasseninstanz?

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: siehe other answer für volleres Beispiel)

0

Sie die Klasse in ich instanziieren.

+0

Warum wäre das ein Problem? Die Rekursion ist hier das Problem. –

2

Das Problem ist hier:

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

Sie sind in den Konstruktor der Klasse selbst den Konstruktor wieder für eine neue Instanz aufgerufen wird. Da bei jedem nachfolgenden Aufruf des Konstruktors ein neuer Konstruktoraufruf erstellt wird, kann der Stapel nicht mehr aufgelöst werden, wodurch ein Stapelüberlauf verursacht wird.

0

Muss Ihre Aktionsklasse wirklich einen Verweis auf eine andere Aktion beibehalten?

Action a; 

Spezifisch, ist diese Linie notwendig? Wofür verwenden Sie es?

3

Try es auf diese Weise tun:

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

sicher, dass Ihr Konstruktor hat rekursiven Aufruf.

0

Die Command design pattern ist ein Weg, um eine Situation zu nähern, wo Sie eine Geschichte von Maßnahmen ergriffen haben wollen, so können sie rückgängig gemacht werden, usw.

0

Constructor rekursiven Aufruf hat.

Verwandte Themen