StackOverflowError

Status
Nicht offen für weitere Antworten.

Sir_Steve

Mitglied
HI!

Ich habe ein kleines Programm geschrieben und wenn ich es ausführe dann bekomme ich folgenden Fehler:

Exception in thread "main" java.lang.StackOverflowError

Kann mia bitte wer sagen was das heißt und wie ich es wegbekomme?

Danke! Schöne Grüße, Steve!
 
B

Beni

Gast
Das liegt meist daran, dass du eine rekursive Methode ohne Abbruchbedingung hast, z.B.
Code:
public void blabla(){
  blabla();
}

Such mal nach so was, und/oder poste Code.
 

Sir_Steve

Mitglied
Okay, hier Code:

Code:
import java.awt.*;
import java.awt.event.*;

class MainFrame extends Frame
{
	private Bewerb frm_Bewerb;
	private Spieler frm_Spieler;
	private Sportart frm_Sportart;
	private Teams frm_Teams;
	private Teilnahme frm_Teilnahme;
	private Trainer frm_Trainer;
	private Turnier frm_Turnier;
	
	private Button btt_Bewerb, btt_Spieler, btt_Sportart;
	private Button btt_Teams, btt_Teilnahme, btt_Trainer, btt_Turnier;
	
	public MainFrame()
	{
		this.frm_Bewerb = new Bewerb();
		this.frm_Spieler = new Spieler();
		this.frm_Sportart = new Sportart();
		this.frm_Teams = new Teams();
		this.frm_Teilnahme = new Teilnahme();
		this.frm_Trainer = new Trainer();
		this.frm_Turnier = new Turnier();
		
		this.btt_Bewerb = new Button("Bewerbe");
		this.btt_Spieler = new Button("Spieler");
		this.btt_Sportart = new Button("Sportart");
		this.btt_Teams = new Button ("Teams");
		this.btt_Teilnahme = new Button ("Teilnahme");
		this.btt_Trainer = new Button("Trainer");
		this.btt_Turnier = new Button("Turnier");
		
		this.showTeams();
		
		this.setSize(800, 50);
		this.setLocation(0,0);
	}
	
	public void showBewerb()
	{
		this.frm_Bewerb.show();
		this.frm_Spieler.hide();
		this.frm_Sportart.hide();
		this.frm_Teams.hide();
		this.frm_Teilnahme.hide();
		this.frm_Trainer.hide();
		this.frm_Turnier.hide();
	}
	
	public void showSpieler()
	{
		this.frm_Bewerb.hide();
		this.frm_Spieler.show();
		this.frm_Sportart.hide();
		this.frm_Teams.hide();
		this.frm_Teilnahme.hide();
		this.frm_Trainer.hide();
		this.frm_Turnier.hide();
	}
	
	public void showSportart()
	{
		this.frm_Bewerb.hide();
		this.frm_Spieler.hide();
		this.frm_Sportart.show();
		this.frm_Teams.hide();
		this.frm_Teilnahme.hide();
		this.frm_Trainer.hide();
		this.frm_Turnier.hide();
	}
	
	public void showTeams()
	{
		this.frm_Bewerb.hide();
		this.frm_Spieler.hide();
		this.frm_Sportart.hide();
		this.frm_Teams.show();
		this.frm_Teilnahme.hide();
		this.frm_Trainer.hide();
		this.frm_Turnier.hide();
	}
	
	public void showTeilnahme()
	{
		this.frm_Bewerb.hide();
		this.frm_Spieler.hide();
		this.frm_Sportart.hide();
		this.frm_Teams.hide();
		this.frm_Teilnahme.show();
		this.frm_Trainer.hide();
		this.frm_Turnier.hide();
	}
	
	public void showTrainer()
	{
		this.frm_Bewerb.hide();
		this.frm_Spieler.hide();
		this.frm_Sportart.hide();
		this.frm_Teams.hide();
		this.frm_Teilnahme.hide();
		this.frm_Trainer.show();
		this.frm_Turnier.hide();
	}
	
	public void showTurnier()
	{
		this.frm_Bewerb.hide();
		this.frm_Spieler.hide();
		this.frm_Sportart.hide();
		this.frm_Teams.hide();
		this.frm_Teilnahme.hide();
		this.frm_Trainer.hide();
		this.frm_Turnier.show();
	}
	
	public static void main(String[] agrs)
	{
		MainFrame Test = new MainFrame();
	}
}

Die Klassen Bewerb, Spieler usw. sind Einfache Frames mit Buttons und so.
Die Klasse Mainframe wird oben angezeigt und symbolisiert so eine Arte Karteikarte...
Naja, und in der main (ganz unten) mach ich halt dann ein Objekt damit der Konstruktor aufgerufen wird.
Das mache ich normal immer so... also...

Grüße. Steve!
 

Sir_Steve

Mitglied
Hm, jetzt kriege ich auch schon bei folgendem Programm eine StackOverflowError:

Code:
import java.awt.*;

public class Trainer extends Frame
{
	private Button Anlegen, Aendern, Loeschen, Dazu, Weg;
	
	private Label Trainer1, Trainer2, Trainer3, Teams; 
	
	private List TrainerList, TeamsList;	
	
	private TextField TrainerName;
	
	private SQLConnector SQL;
	
	public  Trainer ()
	{
		setBackground(new Color(200,200,200));
		
		this.setSize(800,600);
		
		this.setLayout(null);
				
		this.setLocation(0,51);
		
		this.Anlegen = new Button("Anlegen");
		this.Aendern = new Button("Ändern");
		this.Loeschen = new Button("Löschen");
		this.Dazu = new Button("Zum Team hinzufügen");
		this.Weg = new Button("Aus Team entfernen");
		
		this.add(Anlegen);
		this.add(Aendern);
		this.add(Loeschen);
		this.add(Dazu);
		this.add(Weg);
		
		this.Anlegen.setSize(100,20);
		this.Aendern.setSize(100,20);
		this.Loeschen.setSize(100,20);
		this.Dazu.setSize(70,70);
		this.Weg.setSize(70,70);
		
		this.Anlegen.setLocation(250,55);
		this.Aendern.setLocation(350,55);
		this.Loeschen.setLocation(450,55);
		this.Dazu.setLocation(220,200);
		this.Weg.setLocation(220,300);
		
		this.Anlegen.setVisible(true);
		this.Aendern.setVisible(true);
		this.Loeschen.setVisible(true);
		this.Dazu.setVisible(true);
		this.Weg.setVisible(true);
		
		this.TrainerList = new List();
		this.TeamsList = new List();
		this.TrainerName = new TextField("Trainername");
		this.add(TrainerList);
		this.add(TeamsList);
		this.add(TrainerName);
		this.TrainerList.setSize(200,400);
		this.TeamsList.setSize(200,400);
		this.TrainerName.setSize(150,20);
		this.TrainerList.setLocation(10,100);
		this.TeamsList.setLocation(300,100);
		this.TrainerName.setLocation(63,55);
		this.TrainerList.setVisible(true);
		this.TeamsList.setVisible(true);
		this.TrainerName.setVisible(true);
		
		this.Trainer1 = new Label("Trainer");
		this.Trainer2 = new Label("Trainer:");
		this.Trainer3 = new Label("Trainerpool");
		this.Teams = new Label("Teams");
		this.add(Trainer1);
		this.add(Trainer2);
		this.add(Trainer3);
		this.add(Teams);
		this.Trainer1.setSize(100,30);
		this.Trainer2.setSize(100,30);
		this.Trainer3.setSize(100,30);
		this.Teams.setSize(100,30);
		this.Trainer1.setLocation(10,25);
		this.Trainer2.setLocation(10,50);
		this.Trainer3.setLocation(10,75);
		this.Teams.setLocation(300,75);
		this.Trainer1.setVisible(true);
		this.Trainer2.setVisible(true);
		this.Trainer3.setVisible(true);
		this.Teams.setVisible(true);
			
		//hier werden die Trainer angezeigt	
				
		this.setVisible(true);
	}
	
	public void show()
	{
		this.setVisible(true);
		this.setLocation(0,200);
		this.setSize(800, 600);
	}
	
	public void hide()
	{
		this.setVisible(false);
	}												
}

Das ist ein einfaches Frame mit Labels, Buttons und Listboxen....
Da sollte doch kein StackOverFlowError kommen oder??
Also, was kann da falsch sein!

Thx 4 help, Grüße, Steve!
 
B

Beni

Gast
Poste doch mal den StackTrace des Errors. (Throwable#printStackTrace() )
 
R

Roar

Gast
@Beni: du kannst den Error ja nicht anfangen, und da das programm nicht gestoppt wird wenn der error auftritt irgendwie kommt bei meinem produzierten error immer nur das hier:

at Test3.recursive(Test3.java:12)
at Test3.recursive(Test3.java:12)

die gaanze zeit
 

Sir_Steve

Mitglied
aber wie habe ich es geschafft bei einem simplen frame einen stackoverflow error zu bekommen???
das ist doch unlogisch!
noch dazu steht ich unter zeitdruck da ich am mittwoch das projekt fertig haben muss... und wenn ich
meine frames ned ausführen und dadurch anschauen kann wird das wohl nichts...

bitte bitte helft mir!!!
 
R

Roar

Gast
dann lies den stacktrace, bzw. das was davon übrig geblieben ist und schau nach in welcher zeile der error verursacht wurde!

edit: ok, dann mach ich das mal(Trainer hab ich in Test5 umbenannt):

at Test5.show(Test5.java:99)
at java.awt.Component.show(Component.java:1292)
at java.awt.Component.setVisible(Component.java:1247)

du hast die methode show() von java.awt.Window überschrieben, und java.awt.Window#show(); überschreib show() in java.awt.Component.

und darum rufen sich die methoden immerwieder auf.. irgendwie ...
 

Sir_Steve

Mitglied
hm, das ist seltsam:
jetzt habe ich einfach so nochmal ausgeführt, jetzt ist das programm doch glatt ein paar zeilen weit gelaufen!
ohne das ich was verändert habe...

also, der stackoverflow error kommt jetzt bei meinem SQLConnector...
ein fehler davor ist dass ich die datenbank auf die ich zugreifen will noch ned habe, das werde ich beheben...
wenn dann immer noch fehler komm melde ich mich!

und was ist ein stacktrace? und wie schau ich da nach?

grüße, Steve
 
B

Beni

Gast
Das dumme ist, dass der Stackoverflow gar keinen StackTrace produziert (dumme Frage: wie sollte er auch, wenn es keinen Platz mehr hat...)
 

Sir_Steve

Mitglied
LOL! :lol:
jetzt habe ich schnell eine leere datenbank erzeugt, will wieder ausführen und es geht ned...

also nochmal meine frage:

was ist ein stacktrace? und wie schau ich da nach?

grüße, Steve!
 
R

Roar

Gast
ich hab oben genatwortet.. :meld:

zum thema stacktrace: schrieb ich gleichmal in meinen FAQ beitrag
 
B

Beni

Gast
@Roar
und ich habs ausprobiert :###

@Steve
Du kannst mit einem Debugger ein paar Haltepunkte in der Region setzen, in der der Fehler auftritt. Dann lässt du das laufen, und drückst ein paar mal auf "weiter".
Ein vernünftiger Debugger (JBuilder, Eclipse, ...) zeichnet einen eigenen StackTrace auf. Dort solltest du sehen, wenn eine Methode immer wieder aufgerufen wird.
 

Sir_Steve

Mitglied
also gut, ich weiß nun wo inetwa der fehler liegt:

als ich das erste mal den code gepostet habe habe ich die mainframe klasse gepostet!
im konstruktor dieser klasse kommen folgende zeilen vor:

Code:
      this.frm_Bewerb = new Bewerb(); 
      this.frm_Spieler = new Spieler(); 
      this.frm_Sportart = new Sportart(); 
      this.frm_Teams = new Teams(); 
      this.frm_Teilnahme = new Teilnahme(); 
      this.frm_Trainer = new Trainer(); 
      this.frm_Turnier = new Turnier();

in diesen zeilen werden 7 frames erzeugt.
ich habe nun ein paar System.out.println() eingefuegt und der fehler kommt bei der

Code:
      this.frm_Spieler = new Spieler();

Zeile. Das heißt, die bewerb form wird erzeugt (mit sql connector und so)
ABER: die spieler klasse wird nicht mehr aufgerufen.
doch frage ich mich wieso.
diese 2 klassen sind im wesentlich ident ausser dass halt die buttons und so
andere captions haben und ein bissal anderst angeordnet sind...


nochwas:
ich habe in den ganzen klassen (bewerb, spieler usw...) am schluss setVisible(true)
wenn ich die zeilen weggebe wird der konstruktor der spieler aufgerufen...
das wirkt so wie wenn java nur in der lage bestimmt viele zeilen ausführen zu können wäre (lassen wir jetzt das nichtdeutschsein dieses satzes in ruhe)...
oder kann es sein dass java nicht soviele objekte parralel laufen haben kann?
also, was kann ich machen? grüße, Steve
 

Sir_Steve

Mitglied
MUHA! das war es! :D

VIELEN VIELEN DANK AN EUCH ALLE UND AN EURE NIE ENDENDE GEDULD!!!! :toll:

schöne grüße!!! STEVE! 8)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben