Zdravím,
Narazil som na nasledovný problém. Mám funkčnú triedu PlayField, ktorá, keď obsahuje Main() pracuje správne. Avšak, akonáhle chcem túto triedu zavolať zo samostatnej triedy Main (samozrejme odstráním tú, čo je v PlayField) tak dostanem exception StackOverflowError.
Volám ju takto:
PlayField play = new PlayField();
Konštruktor PlayFieldu:
public PlayField() {
run();
initComponents();
}
run():
public void run() {
new PlayField().setVisible(true);
}
Výpis z exceptionu vyzerá, ako keby sa táto metóda volal stále a stále od znova, avšak bez nejakej akcie, nič sa nevykonáva.
at java.awt.Window.init(Window.java:370)
at java.awt.Window.<init>(Window.java:408)
at java.awt.Frame.<init>(Frame.java:402)
at java.awt.Frame.<init>(Frame.java:367)
at javax.swing.JFrame.<init>(JFrame.java:163)
at lode.PlayField.<init>(PlayField.java:28)
at lode.PlayField.run(PlayField.java:100)
at lode.PlayField.<init>(PlayField.java:29)
at lode.PlayField.run(PlayField.java:100)
at lode.PlayField.<init>(PlayField.java:29)
Vyskúšal som už snáď všetko, čo je v mojich silách. Budem rád, za každú pomoc.
Fórum › Java
StackOverflowError
![](img/forum_vlakno_help_vyreseno.png)
Ten program dělá přesně to, co jsi napsal. Vytvoříš objekt PlayField(). Ten v konstruktoru zavolá svou metodu run() a ta opět vytvoří objekt PlayField. A tento nově vytvořený objekt spustí run() a v něm vytvoří znovu další objekt PlayField. A pak run() a vytvoří se zase nový PlayField(). A pak...
Skoro by se člověk až divil, proč v konstruktoru objektu PlayField vytváříš další objekt, moc to nedává smysl :)
To Quiark : Moja chyba :-(.
A ešte by som sa chcel spýtať, napríklad chcem presunúť metódu createMesh z PlayField do triedy Mesh.
Chcem podoktnúť, že metóda createMesh vytvára komponenty do gridLayoutu JPanelu, takže po jeho vytvorení ich tam chcem pridať.
A chcem sa spýtať, akým spôsobom túto metódu zavolať. Keď dám do triedy (po vytvorení JPanelu) objekt, ktorý volá konštruktor triedy Mesh, v ktorom je zavolanie metódy createMesh() (tá by mala do tohto JPanelu pridať komponenty), program vyhodí rovnakú chybu ako som popisoval v prvom príspevku.
Čo robím v tomro prípade zle?
Pokud ti to hází stejnou chybu, bude to mít stejnou příčinu. Stack trace by ti měl ukázat, která metoda se volá opakovaně. Tak úplně se mi nepodařilo pochopit, jak popisuješ že to máš udělané, trošku se mi zdá, že v OOP pojmech si nejsi na 100 % jistý. V zásadě mi ale příjde, že úvahu máš správnou. Tedy třída Mesh má metodu, která vytvoří nějaké komponenty v jiné komponentě:
...
class Mesh {
public Mesh() {
createMesh();
}
private void createMesh() {
neco.add(neco jineho);
}
}
takhle se při vytvoření instance třídy Mesh rovnou spustí createMesh a ten panel se naplní komponentami. Toto je potřeba provést jen jednou, takže je potřeba Mesh vytvořit jen jednou.
Můžeš to dát v podstatě kam chceš. Ale pokud ti to hází tuhle chybu, tak určitě někde spouštíš něco pořád dokola. Podívej se do té chyby, které metody se volají opakovaně. A určitě někde zbytečně neděláš new PlayField() nebo tak něco?
![](img/forum_nove_psp_new.png)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Problém se StackOverflowError — založil Anonymní uživatel
Moderátoři diskuze