StackOverflowError – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

StackOverflowError – Java – Fórum – Programujte.comStackOverflowError – Java – Fórum – Programujte.com

 

deli
~ Anonymní uživatel
6 příspěvků
20. 6. 2009   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 193.85.210.–
Quiark0
Věrný člen
20. 6. 2009   #2
-
0
-

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 :)

Nahlásit jako SPAM
IP: 193.86.140.–
deli
~ Anonymní uživatel
6 příspěvků
20. 6. 2009   #3
-
0
-

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?

Nahlásit jako SPAM
IP: 193.85.210.–
Zerog0
Newbie
20. 6. 2009   #4
-
0
-

To deli : Na kolika forech to jeste resis? :)

Nahlásit jako SPAM
IP: 89.103.5.–
deli
~ Anonymní uživatel
6 příspěvků
20. 6. 2009   #5
-
0
-

To Zerog : Len tu a tam :-).

Nahlásit jako SPAM
IP: 193.85.210.–
Quiark0
Věrný člen
20. 6. 2009   #6
-
0
-

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.

Nahlásit jako SPAM
IP: 193.86.140.–
deli
~ Anonymní uživatel
6 příspěvků
20. 6. 2009   #7
-
0
-

To Quiark : Presne tak to myslím. Avšak, kde mám umiestniť vytvorenie inštancie triedy Mesh? Nech ho do triedy PlayField umiestnim hocikde, vyhadzuje to rovnakú chybu.

Nahlásit jako SPAM
IP: 193.85.210.–
Quiark0
Věrný člen
20. 6. 2009   #8
-
0
-

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?

Nahlásit jako SPAM
IP: 193.86.140.–
deli
~ Anonymní uživatel
6 příspěvků
20. 6. 2009   #9
-
0
-

To Quiark : Vo výpise stále pendluje medzi konštruktorom Mesh() a initComponents(). Ale vzdávam to, musím to spraviť celé na novo. Každopádne ti veľmi pekne ďakujem za čas a námahu.

Nahlásit jako SPAM
IP: 193.85.210.–
Quiark0
Věrný člen
20. 6. 2009   #10
-
0
-

Takže určitě v initComponents() máš new Mesh(). Což je blbě a je to stejný problém jako předtím. Co tě k tomu vede?

Nahlásit jako SPAM
IP: 193.86.140.–
deli
~ Anonymní uživatel
6 příspěvků
21. 6. 2009   #11
-
0
-

To Quiark : Vedie ma k tomu moja nedôkladnosť :-). Musím si zvykať robiť veci poriadne a nie hala-bala, čiže to je ten dôvod, prečo to chcem spraviť nanovo.

Nahlásit jako SPAM
IP: 193.85.210.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Problém se StackOverflowError — založil Anonymní uživatel

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý