# StackOverflow bei Objekterstellung



## Jayan (16. Mrz 2012)

Hallo liebe Forumgemeinde,

Ich bin kürzlich bei meiner Spieleprogrammiersession auf folgende Fehlermeldungen gestoßen:

 java.lang.StackOverflowError
at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.jav a:266)
at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.jav a:243)
at java.util.GregorianCalendar.computeFields(Gregoria nCalendar.java:2276)
at java.util.GregorianCalendar.computeFields(Gregoria nCalendar.java:2248)
at java.util.Calendar.setTimeInMillis(Calendar.java:1 140)
at java.util.GregorianCalendar.<init>(GregorianCalend ar.java:621)
at java.util.GregorianCalendar.<init>(GregorianCalend ar.java:586)
at sum.werkzeuge.Uhr.<init>(Uhr.java:22)
at Draw.<init>(Draw.java:22)
at Tracker.<init>(Tracker.java:20)
at Text.<init>(Text.java:20)
at Draw.<init>(Draw.java:31)
at Tracker.<init>(Tracker.java:20)
at Text.<init>(Text.java:20)
at Draw.<init>(Draw.java:31)
at Tracker.<init>(Tracker.java:20)
at Text.<init>(Text.java:20) 

Das komische: Ich habe an den angegebenen Stellen nichts seit der vorherigen "Version" geändert, und vorher ging alles einwandfrei. Weiterer Punkt, der mich stutzig macht: Da, wo der Error ist (Konstruktor beim erstellen des Objektes) KANN normalerweise kein Fehler auftreten. Ansonsten würde der Compiler meckern.

Hier mal Kurz die Fehlerpunkte:

```
import sum.werkzeuge.*;
import sum.kern.*;
class Tracker
{
Uhr u;
int x;
Maus m;
Tastatur t;
private Draw draw;
public Tracker()
{
u = new Uhr();   //<--------------- dort
x = 0;
m = new Maus();
t = new Tastatur();
draw = new Draw();
}
```
--------------

```
import sum.kern.*;
import sum.werkzeuge.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Text
{
Stift pen;
Uhr u;
Rechner r;
int x;
String playername;
private Tracker tracker;
private Draw draw;
public Text()
{
pen = new Stift();
u = new Uhr();       //<----- dort
r = new Rechner();
tracker = new Tracker();
draw = new Draw();
x = 0;
playername = "none";
}
```
--------------

```
public Draw()
{
pen = new Stift();
u = new Uhr();       //<------ dort
z = 0;
x = 0;
y = 0;
xw = 0;
yw = 0;
tileset = new Tileset();
obj = new Obj();
levels = new Levels();
text = new Text();
shade = new Shade();
levelobjects = new Levelobjects();
render = new Render();
}
```
----

Was könnte DORT schieflaufen? *confused

Link zum Download des gesamten Projekts:
http://db.tt/ROjSaACa 

Falls man es noch nicht gemerkt hat: ich arbeite mit Java, speziell den SuM Bibliotheken (wegen der Schule >.<)

mFg

Jay~


----------



## maki (16. Mrz 2012)

Sieh dir denn Stacktrace an, imho läuft da eine Endlosschleife, wie so oft Ursache für einen StackOverflowError...


----------



## SlaterB (16. Mrz 2012)

Schleifen im normalen Sinne (for, while) sind doch selten die Ursache,
ein Zyklus besteht, besserer Begriff 

Text erzeugt Tracker, Tracker erzeugt Draw, Draw wiederum Text (oder ähnlich) und das ganze geht wieder von vorne los,
natürlich auch glasklar in der Fehlermeldung zu erkennen

der Compiler kann sowas nicht im Voraus erahnen, jedenfalls nicht ohne ein gewisses Intelligenz-Level

willst du eigentlich, dass z.B. alle unterschiedliche Uhr-Objekte haben?
wie sieht es mit den anderen Objekten aus, braucht jeder eigene neue Versionen oder sollen einmal erzeugte Objekte gegenseitig verlinkt werden?

lasse die Konstruktoren leer, erzeuge an zentraler Stelle von jeder Sorte ein Objekt und rufe dann gegenseitig set-Methoden auf
oder init(alle benötigten Parameter)


----------

