Java Kleines Kinoprogramm läuft nicht

Zerstoerer

Lieutenant
Registriert
Okt. 2010
Beiträge
685
Guten Abend zusammen,

bin gerade dabei ein kleines Programm zu programmieren, wo man etwas wählen kann, dann die anzahl und ein paar Features, dieses dann bezahlen und "mitnehmen" kann. Allerdings kommt immer der Fehler, das mein double Wert "GUI.java:455:15: variable rueckgeld might not have been initialized".Die Method geht so:

public double rueckgeldAuszahlen() {
double k = 0;
double rueckgeld;
if(d == false) {
k = 0.0;
} else if(d == true) {
k = 1.5;
}
if(kino.eingeworfen >= (kino.sorte+k)*karten) {
double r = kino.eingeworfen - kino.sorte;
if(kino.kasse.muenzeAuszahlen(r) == true) {
kino.sorte = 0;
kino.eingeworfen = 0;
rueckgeld = r;
} else if(kino.kasse.muenzeAuszahlen(r) == false) {
rueckgeld = 0.0;
}
} else {
rueckgeld = 0.0;
}
return rueckgeld;
}

Hat jemand ne Ahnung was daran falsch sein könnte? In den kino Methoden wird nur etwas berechnet. Falls nötig kann ich auch den Rest posten.

Wäre dankbar für ein paar Hinweise.
 
mach mal double rueckgeld = 0; in der 3. zeile.
du weist rueckgeld nur in den Blöcken etwas zu. Der Compiler weiß aber nicht, ob die Blöcke zwangsweise aufgerufen werden -> es ist möglich, dass rueckgeld keinen wert hat (und ist damit nicht initialisiert).
 
java möchte alle variablen vor benutzung initialisiert haben. da der compilernicht sehen kann dass rückgeld immer nen wert bekommt, reicht es, double rückgeld = 0; zu schreiben
EDIT: zu spät ;)
 
Steht doch da: variable rueckgeld might not have been initialized

Mach mal double rueckgeld = 0;
 
Ursache:
Code:
if(kino.eingeworfen >= (kino.sorte+k)*karten) {
  double r = kino.eingeworfen - kino.sorte;
  if(kino.kasse.muenzeAuszahlen(r) == true) {
    kino.sorte = 0;
    kino.eingeworfen = 0;
    rueckgeld = r;
  } else if(kino.kasse.muenzeAuszahlen(r) == false) {
    rueckgeld = 0.0;
  } [color=red]else { // <---dieser Fall kann auch passieren
    // hier bleibt rueckgeld uninitialisiert...
  }[/color]
} else {
  rueckgeld = 0.0;
}


Schön dass jeder ne Lösung schreibt aber keiner begründet, warum es nicht ging...

@F.b: Der Compiler hat im Gegensatz zu dir nichts übersehen...

@BloodHunter2k8: Auch falsch begründet...

Das Problem ist, dass es einen Code-Zweig gibt, in dem rueckgeld eben keine Zuweisung bekommt.
 
Zuletzt bearbeitet:
wie meinst du das?
außerdem wurde bereits in der ersten antwort ne begründung gegeben
 
da der compilernicht sehen kann dass rückgeld immer nen wert bekommt
Das ist Unsinn, der Compiler sieht das sehr wohl. Er sieht, dass es eben nicht immer passiert. Siehe die Kommentare in den von mir geposteten Code. Auch die Begründung in der ersten Antwort war falsch.
 
1668mib hat Recht,
bei richtiger Einrückung würde man den Fehler deutlich einfacher finden. (garnicht so einfach mit der Forensoftware xD)
 
Zuletzt bearbeitet:
@Sumpfmonster: Ich geh davon aus, dass der Code eingerückt war, aber ohne Code-Tag verliert er diese halt hier im Forum ;-)

Edit:
Wobei es mir hier ja nur um die Ursache ging.

Stilistisch würde ich die ganze Sache wohl deutlich vereinfachen...

Edit2:
Ok ich versteh jetzt das Problem ein wenig besser...
Ja, der Compiler ist hier echt zu doof :-)
Wobei keiner wissen kann, ob wiederholter Aufruf von kino.kasse.muenzeAuszahlen(r) auch wirklich immer das selbe Ergebnis zurückliefert... auch wenn man es annehmen sollte :-)

deshalb einfach ein else ohne if machen da...
Code:
if(kino.eingeworfen >= (kino.sorte+k)*karten) {
  double r = kino.eingeworfen - kino.sorte;
  if(kino.kasse.muenzeAuszahlen(r) == true) {
    kino.sorte = 0;
    kino.eingeworfen = 0;
    rueckgeld = r;
  } else { // if(kino.kasse.muenzeAuszahlen(r) == false) {
    rueckgeld = 0.0;
  }
} else {
  rueckgeld = 0.0;
}
 
Zuletzt bearbeitet:
oh, das ist mir gar nicht aufgefallen. dann hast du wohl recht, sorry :)
 
So ganz unrecht hattet ihr hier wie ich im Edit schrieb ja auch nicht :-)
 
dann eben so, ist für mich ehrlich gesagt jacke wie hose, das muss initialisiert werden und fertig ;)
 
Wobei es halt besser ist, wenn man weiß, warum etwas initialisiert werden muss bzw. warum der Compiler denkt, dass es das nicht wurde, als es einfach zu machen.
 
Da stimme ich dir zu. Ist für mich eh schlechter Stil Variablen nicht bei der Deklaration schon zu initialisieren.
 
Da widerspreche ich dir ...
ich finds schlechten Stil, Variablen die genau einmal einen Wert bekommen nicht final zu machen.

würde dann hier in diese Richtung gehen
Code:
private double getK() {
  if (d) {
    return 1.5;
  } else { 
    return 0;
  }
}


public double rueckgeldAuszahlen() { 
  final double result;
  final double k = getK();

  if (kino.eingeworfen >= (kino.sorte + k) * karten) {
    double r = kino.eingeworfen - kino.sorte;
    if (kino.kasse.muenzeAuszahlen(r)) {
      kino.sorte = 0;
      kino.eingeworfen = 0;
      result = r;
    } else {
      result = 0.0;
    }
  } else {
    result = 0.0;
  }
  
  return result;
}
(der Code is immer noch schlecht, weil ich gewisse Dinge nicht verstehe)

aber das ist nun offtopic 2.0 ;-)
 
Ok habe jetzt den Hinweis genommen, dass if bei dem else wegzulasse und es klappt.
Bedanke mich herzlich.
 
Zurück
Oben