StackOverflowError

Status
Nicht offen für weitere Antworten.

Reality

Top Contributor
Hi,
ich arbeite mit meinem JAVA-Buch und da schreibt der Auto ein relativ großes Programm nieder mit dem man Autos verwalten kann.
Wegen der Unübersichtlichkeit blick ich nicht mehr ganz durch, wo ich anscheinend auch einen Fehler übersehen habe:

Code:
package fahrzeug;
import java.io.*;

public class Auto extends StrassenFzg {

public short plaetze;
public final static int VK_KM= 50000;
public static int anz_autos=0;

public Auto(){
    anz_autos++;
  }

public Auto(String k_bez, short k_geschw, short k_plaetze){
bez=k_bez;
geschw=k_geschw;
plaetze=k_plaetze;
anz_autos++;
}

public boolean eingeben(){

InputStreamReader daten=new InputStreamReader(System.in);
BufferedReader eingabe;
eingabe= new BufferedReader(daten);
try{
System.out.print("Bezeichnung: ");
bez=eingabe.readLine();
System.out.print("Sitzplaetze: ");
plaetze=Short.parseShort(eingabe.readLine());
System.out.print("Geschwindigkeit: ");
geschw=Short.parseShort(eingabe.readLine());
return true;

}catch (Exception e)
{
return false;
}
}

  public boolean anzeigen() {

  System.out.println("\nDas Auto ist ein "+bez);
  System.out.println("Es hat "+plaetze+" Sitze.");
  System.out.println("Der Top-Speed: "+geschw);
  if(verliehen)
  System.out.println("Es ist verliehen.");
  else
  System.out.println("Es ist nicht verliehen.");
  return true;
  }

  public String list_eintrag(){
    String text;
    text= bez+", "+plaetze+" Sitzplaetze, "+geschw+" km/h Hoechstgeschwindigkeit";

    if(verliehen)
      text=text+" *";
      return text;
  }
}

Code:
import java.io.*;
import fahrzeug.*;

public class CarControl {

  static int anz_autos=0;
  static final int AUTO_MAX= 50;
  static Auto[] auto_liste= new Auto[AUTO_MAX];

  public static void main(String[] args){
  short auswahl;
  BufferedReader eingabe= new BufferedReader(
                          new InputStreamReader(System.in));
  do{
  //erst mal das Menue ausgeben
  System.out.println("\nCarControl - die objektorientierte Fahrzeugverwaltung");
  System.out.println("======================================================");
  System.out.println("\nHauptmenue");
  System.out.println("\n[1] Autos anzeigen");
  System.out.println("\n[2] Neues Auto");
  System.out.println("\n[0] Programm beenden");
  try{
  //versuchen, die Benutzereingabe zu lesen
  System.out.print("\nAuswahl: ");
  auswahl=Short.parseShort(eingabe.readLine());
  //Benutzereingabe verarbeiten
  switch (auswahl){
  case 1:
  liste_anzeigen(anz_autos);
  break;
  case 2:
  if (anz_autos <AUTO_MAX && anz_autos>=0){
  anz_autos=neues_auto(anz_autos);
  }
  else
  System.out.println("Die Autosliste ist voll!");

  break;
  case 0:
  System.out.println("\nBis bald...");
  break;
  default:
  System.out.println("\nFalsche Eingabe!");
  }
  }catch (Exception e) //falsche Eingabe??
  {
auswahl= Short.MIN_VALUE;
System.out.println("Nur ZAHLEN eingeben!");
      }
    }while(auswahl !=0);
  }


static int neues_auto(int auto_nr){

  anz_autos=neues_auto(anz_autos); //Was soll das bewirken?!
  auto_liste[anz_autos]=new Auto();



  System.out.println("====================");
  auto_liste[auto_nr]= new Auto();
  while(auto_liste[auto_nr].eingeben()==false){
  System.out.println("Fehlerhafte Eingabe!");
  }
  System.out.println("Neues Auto angelegt.");
  return (auto_nr+1);
  }

  static void liste_anzeigen(int auto_nr){
System.out.println("==========\n");

for(int i=0; i<auto_nr;i++){
System.out.print("["+(i+1)+"] ");
System.out.println(auto_liste[i].list_eintrag());
}
}

  }

StrassenFZG, habe ich jetzt hier nicht gepostet, ist unwichtig.
So, wenn ich nun kompiliere, läuft alles glatt, wenn ich aber dann im Menü "2" eingebe, dann kommt einer Fehlermeldung:

java.lang.StackOverflowError

at CarControl.neues_auto(CarControl.java:56)

at CarControl.neues_auto(CarControl.java:56)

at CarControl.neues_auto(CarControl.java:56)

at CarControl.neues_auto(CarControl.java:56)

at CarControl.neues_auto(CarControl.java:56)
....
etc.

Was kann das sein?!

Liebe Grüße
Reality
 
B

Beni

Gast
Das ist eine falsch geschriebene rekursive Methode.
Eine Methode die sich immer wieder selbst aufruft. Da leider keine Abbruchbedingung eingebaut ist, führt das zu einer Exception (wenn der Speicher aufgebraucht ist).

Code:
static int neues_auto(int auto_nr){

  anz_autos=neues_auto(anz_autos); //Was soll das bewirken?! 
// genau, das ist auch meine Frage. Was soll dieser Fehler zeigen?
 

Reality

Top Contributor
Hi Beni!!!! :D
Ich danke dir! Über diesen Code-Abschnitt gab es schon einmal einen Thread dazu.
Jedenfalls habe ich 2 Zeilen Code so entfernt, dass nur noch das da stand:
Code:
static int neues_auto(int auto_nr){

  System.out.println("====================");
  auto_liste[auto_nr]= new Auto();
  while(auto_liste[auto_nr].eingeben()==false){
  System.out.println("Fehlerhafte Eingabe!");
  }
  System.out.println("Neues Auto angelegt.");
  return (auto_nr+1);
  }

Jetzt geht alles wunderbar. Ich danke dir vielmals!!! Ich habe mir schon überlegt ein neues Buch dazu zu kaufen, aber jetzt lass ich das erst mal.

Viele liebe Grüße
Reality
 
R

Roar

Gast
@reality; ist das zufällig das buch von Alexander Niemann: Java - Einsteigerseminar ? das ist cool :) war auch mein einstieg in java :)
 
B

bygones

Gast
naja - was ist das denn für ein Buch das falschen Code drinnen stehen hat ?
Außerdem sind folgende Test überflüssig:
Code:
while(auto_liste[auto_nr].eingeben()==false){
Warum nicht gleich:
Code:
while(!auto_liste[auto_nr].eingeben()){
Hoffe ansonsten macht das Buch diese Fehler wieder gut !
 

Reality

Top Contributor
@ Roar: Ja, das ist es. Finde, dass jedoch an manchen Stellen die Erklärungen dazu zu knapp sind bzw. nicht vorhanden, aber in anderen nicht relevanten Dingen zu viel herumgeplappert wird: "Stellen Sie sich vor der Kunde müsste blablablabla".

@deathbyaclown: Die Möglichkeit hat er auch im Buch stehen. Hab eben die erste abgeschrieben, weil sie eben als erstes abgedruckt war.

Liebe Grüße
Reality
 
R

Roar

Gast
naja ich kann das buch aber nur empfehlen. in dem buch hab ich oop verstanden ( nach dem es in c++ in 21 tagen nicht geklappt hat).. und die beispiele sind auch gut....



...eigentlich :wink:
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben