Java Kleines Kinoprogramm läuft nicht

Zerstoerer

Lieutenant
Dabei seit
Okt. 2010
Beiträge
684
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.
 

Timmey92

Commodore
Dabei seit
Okt. 2008
Beiträge
4.540
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).
 

F.b

Lieutenant
Dabei seit
Feb. 2008
Beiträge
513
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 ;)
 

locomarco

Commander
Dabei seit
Aug. 2009
Beiträge
2.446
Steht doch da: variable rueckgeld might not have been initialized

Mach mal double rueckgeld = 0;
 
1

1668mib

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

F.b

Lieutenant
Dabei seit
Feb. 2008
Beiträge
513
wie meinst du das?
außerdem wurde bereits in der ersten antwort ne begründung gegeben
 

Sumpfmonster

Lieutenant
Dabei seit
Jan. 2008
Beiträge
720
1668mib hat Recht,
bei richtiger Einrückung würde man den Fehler deutlich einfacher finden. (garnicht so einfach mit der Forensoftware xD)
 
Zuletzt bearbeitet:
1

1668mib

Gast
@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:

F.b

Lieutenant
Dabei seit
Feb. 2008
Beiträge
513
oh, das ist mir gar nicht aufgefallen. dann hast du wohl recht, sorry :)
 
1

1668mib

Gast
So ganz unrecht hattet ihr hier wie ich im Edit schrieb ja auch nicht :-)
 

Timmey92

Commodore
Dabei seit
Okt. 2008
Beiträge
4.540
dann eben so, ist für mich ehrlich gesagt jacke wie hose, das muss initialisiert werden und fertig ;)
 
1

1668mib

Gast
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.
 

Timmey92

Commodore
Dabei seit
Okt. 2008
Beiträge
4.540
Da stimme ich dir zu. Ist für mich eh schlechter Stil Variablen nicht bei der Deklaration schon zu initialisieren.
 
1

1668mib

Gast
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 ;-)
 

Zerstoerer

Lieutenant
Ersteller dieses Themas
Dabei seit
Okt. 2010
Beiträge
684
Ok habe jetzt den Hinweis genommen, dass if bei dem else wegzulasse und es klappt.
Bedanke mich herzlich.
 
Top