fif-Anweisung funktioniert nicht wie erwartet

Rufus.Mueller

Bekanntes Mitglied
Bei folgender if-Anweisung wird immer "Richtig" ausgegeben, auch wenn durch Konsolenausgabe nachgewiesen wird, dass sequenzenGleich den Wert false hat.


Java:
if (sequenzenGleich = false) {
			window.corsiPlatte.rueckmeldung.setText("Falsch!");}
		else 
			{window.corsiPlatte.rueckmeldung.setText("Richtig!");}
		
		window.corsiPlatte.rueckmeldung.setVisible(true);
		return bestanden;  //Das ist evtl. noch zu ändern
 
Unmöglich

und Ohne zu sehen, wie
Code:
sequenzenGleich
geändert wird, kann man auch nicht mehr dazu sagen.
 
Das war das Problem, jetzt geht es. Komisch das Eclipse nicht meckert bei einer Anweisung if false{...} . Die dürfte ja nie erfüllt werden, so wie if (true) {...} immer erfüllt sein müsste.
 
Also bei den richtigen Einstellungen meckert Eclipse da schon. Bei "Java->Compiler->Errors/Warnings" kann man in der Kathegorie "Potentielle Programmierfehler" auch für "Dead Code" WARN, ERROR oder IGNORE einstellen.
 
@Spacerat

das dachte ich auch. Aber im Fall des Threaderstellers wird keine Warnung ausgegeben (siehe Screenshot; die Warnung bezieht sich darauf, dass auf die Variable nicht lesend zugegriffen wird)
 

Anhänge

  • screenshot.png
    screenshot.png
    11,7 KB · Aufrufe: 41
Das mit der Warnung ist so eine Sache. Rein formal ist (sequenzGleich = false) eine Zuweisungsoperation. Und die wird automatisch als "true" evaluiert, was letztlich nichts anderes bedeutet als "Zuweisung wurde durchgeführt".

Rufus es gibt da einen kleinen Trick. Wenn Du mit Konstanten vergleichst, gewöhn Dir an sie nach vorne zu schreiben.
if( false == sequenzGleich ) wird dann zu if( false = sequenzGleich ) wenn man nicht aufpasst und da bekommt man dann Gemecker.


Edit: musiKk hats weiter unten angesprochen. Seqenzgleich = false wird natürlich nicht zu "true" evaluiert, sondern zu "false".
Das gibt für die Bedingungen dann if( false ) ...
 
Zuletzt bearbeitet:
...es gibt da einen kleinen Trick. Wenn Du mit Konstanten vergleichst, gewöhn Dir an sie nach vorne zu schreiben.
if( false == sequenzGleich ) wird dann zu if( false = sequenzGleich ) wenn man nicht aufpasst und da bekommt man dann Gemecker.
Na das ja mal'n Tip. Hab mich schon gewundert, warum man solche Konstrukte
Code:
if(null == object)
immer öfter sieht 😉
 
Das mit der Warnung ist so eine Sache. Rein formal ist (sequenzGleich = false) eine Zuweisungsoperation. Und die wird automatisch als "true" evaluiert, was letztlich nichts anderes bedeutet als "Zuweisung wurde durchgeführt".

Das ist Quatsch. Das Resultat einer Zuweisung ist der zugewiesene Wert, nicht [c]true[/c]. Darum funktioniert auch sowas wie [c]int i, j; i = j = 1;[/c].
 
musiKk, da hast Du recht, aber wenn Du boolesche Werte verwendest gibts doch nur true und false? (vielleicht versteh ich Dich aber auch falsch)
Ich hab aber trotzdem Unsinn geschrieben, weil "sequenzGleich = false" natürlich zu "false" evaluiert wird und nicht zu "true". Bzw. dann zu if( false ) ...

Das Resultat ist doch genaugenommen nicht der zugewiesene Wert, sondern das zugewiesene Objekt.
Bei
Java:
Integer a = 0;
if( (a = 1)  )
...
hat man doch das Objekt und nicht den Wert innerhalb der Klausel.
(Ist zwar irgendwie "egal", aber dennoch.)
 
Zuletzt bearbeitet:
Ich hab aber trotzdem Unsinn geschrieben, weil "sequenzGleich = false" natürlich zu "false" evaluiert wird und nicht zu "true". Bzw. dann zu if( false ) ...

Genau das meine ich. Es klang so, als würde jede Zuweisung den Wert [c]true[/c] ergeben, was nicht stimmt. War wohl einfach ein Verdreher (ist bei boolean eben fatal 😉).

Das Resultat ist doch genaugenommen nicht der zugewiesene Wert, sondern das zugewiesene Objekt.

Bei primitiven Typen der Wert, bei Referenztypen die Referenz (welche auch ein Wert ist). Etwas anderes gibt es in Java nicht. Bei [c]Integer[/c] geschieht natürlich vorher noch Autoboxing.
 

Zurück
Oben