Java Funktion klappt plötzlich nicht mehr

torben

Ensign
Registriert
Feb. 2014
Beiträge
254
Servus Leute,

ich sitze gerade mit einem Kumpel an einem Schulprojekt.
Dabei geht es um den Nachbau von Wer Wird Millionär? in der Konsole.

Prinzipiell funktioniert alles, bis eben, als wir das Programm nach gestern Abend wieder starteten.

Plötzlich ging folgender Code nicht mehr:
Code:
      if(whileinput==(C[stufe][Frage][5])){       
         System.out.println("Die Antwort war richtig!");
        } // end of if
      else {
        System.out.println("Deine Antwort ist leider nicht richtig." + "\n" + "Damit sind sie Leider ausgeschieden. Viel Glück beim Nächsten mal.");
        System.out.println("Die Richtige Antwort wäre " + C[stufe][Frage][5] + " gewesen");
        return;
        } //End of else

Hierbei scheint Java die komplette if-Zeile mehr oder weniger zu ignorieren, obwohl es gestern noch einwandfrei ging.
Zur Erklärung: whileinput ist die Eingabe der Antwort des Gefragten. Diese wird mit einem Array abgeglichen, der aus dem folgenden Aufbau ensteht.

In C[x][y][z] ist
x -> Die Stufe (zwischen 1-5)
y -> eine von drei zufällig ausgewählten Fragen
z -> Die Frage selber [0], die Antwortmöglichkeiten[1-4], die richtige Antwort[5]
Das Ganze wird aus einer Textdatei importiert, da dies die Aufgabenstellung ist.

Das Problem haben wir einfach so gelöst, dass wir
Code:
if(whileinput==(C[stufe][Frage][5]))
durch
Code:
if(whileinput.matches(C[stufe][Frage][5]))
ersetzt haben. Damit funktioniert es dann einwandfrei.

Nun meine Frage ist, wieso es beim Ersten nicht klappt, obwohl es doch im Endeffekt aufs Gleiche herauskommt, oder nicht?

Hoffe meine Frage ist verständlich formuliert :rolleyes:

Danke schonmal für eure Erklärungen.

PS: Der Aufbau der Textdatei ist
FRAGE1
Antwort1a
Antwort1b
Antwort1c
Antwort1d
tatsächlicheAntwort
Frage2(für Stufe 1 wohlgemerkt)
Antwort2a
2b
2c
2d
tatsächlicheAntwort
etc.
 
Zuletzt bearbeitet:
Dass sollte daran liegen dass man in Java mit dem == Operator bei einem String nur Vergleicht ob es der selbe String ist und nicht der gleiche Inhalt. Mit Equals prüft man zwei Strings auf den gleichen Inhalt.

Hier wird das einmahl ausführlicher erklärt.
 
Ahh okey.
Heißt also wenn ich es richtig verstehe
Das
Code:
if(whileinput==(C[stufe][Frage][5]))
muss zu
Code:
if(whileinput.equalsIgnoreCase(C[stufe][Frage][5]))]
geändert werden, damit es auf das gleiche wie mit .matches rauskommt?


Gut zu wissen, vielen Dank!
 
Nur s1.equals(s2). Dieses IgnoreCase kenne ich nicht.
== prüft bei Strings nur die Referenzen.
 
Torben2911 schrieb:
Ahh okey.
Heißt also wenn ich es richtig verstehe
Das
Code:
if(whileinput==(C[stufe][Frage][5]))
muss zu
Code:
if(whileinput.equalsIgnoreCase(C[stufe][Frage][5]))]
geändert werden, damit es auf das gleiche wie mit .matches rauskommt?


Gut zu wissen, vielen Dank!

Nur .Equals also so: if(whileinput.equalse[stufe][Frage][5]))
 
Nein, ist nicht das gleiche, nur was ähnliches.

Also:

== vergleicht, ob beide Objekte das selbe sind. Die primitiven Datentypen werden die Werte verglichen (int, double, ...). String ist leider nicht primitiv. Ob bei == bei Objekten wahr ist, ist die Frage nach dem "selben" und nicht nach dem "gleichen" (es können zwei gleiche Autos auf dem Parkplatz stehen, aber nicht dasselbe zwei mal).

String.matches(String regex) wertet den regulären Ausdruck regex aus. Also ne komplexe Funktion. In deinem Fall wohl zufälligerweise ein Vergleich auf die Gleichheit.

String.equalsIgnoreCase prüft auf die Gleichheit (nicht Identität!), allerdings, ohne die Großkleinschreibung zu beachten also "test".equasIgnoreCase("TEST") == true

Was du wohl suchst:

String.equals prüft auf gleichen Stringinhalt.


BTW: Wenn du eine IDE verwendest (z.B. Eclipse), dann warnt die in der Regel bei einem == von zwei Objekten, die equals implementiert haben.
 
Hi, danke für die Antworten.
Wir haben bewusst in dem Fall .equalsIgnoreCase genommen, da in der Textdatei nur ein Buchstabe steht und wir so den Fall umgehen wollen, wenn zwar der Buchstabe eingegeben wird aber z.B. dann aber großgeschrieben. Dann würde ja bei nur .equals es nicht true sein, weil in der .txt dann ein kleines "b" drinsteht.


Aber vielen Dank für die Antworten. Hat es um einiges verständlicher gemacht!
 
Stringvergleiche mit == in Java können sehr verwirrend sein. Dank String Interning funktioniert der Vergleich manchmal sogar und anderswo dann eben nicht. Hintergründe hierzu in diesen Artikel: String Equality and Interning
Deshalb für Stringvergleiche in Java immer mit equals() oder vergleichbaren Methoden arbeiten, aber nicht wundern wenn es manchmal dann doch mit == funktioniert.
 
Torben2911 schrieb:
Hi, danke für die Antworten.
Wir haben bewusst in dem Fall .equalsIgnoreCase genommen, da in der Textdatei nur ein Buchstabe steht und wir so den Fall umgehen wollen, wenn zwar der Buchstabe eingegeben wird aber z.B. dann aber großgeschrieben. Dann würde ja bei nur .equals es nicht true sein, weil in der .txt dann ein kleines "b" drinsteht.


Aber vielen Dank für die Antworten. Hat es um einiges verständlicher gemacht!

dann nutze doch lieber vor dem .equals ein .toLowerCase auf den String, so stellst du sihcer das der string immer klein ist.
 
theitguy schrieb:
dann nutze doch lieber vor dem .equals ein .toLowerCase auf den String, so stellst du sihcer das der string immer klein ist.

Als Anfänger kenne ich die ganzen Möglichkeiten noch nicht ;) Aber danke für den Hinweis!
 
equalsIgnoreCase() ist schon die richtige Wahl wenn der String nicht vorher verändert werden kann/soll.

Heißt, Du solltest nicht equalsIgnoreCase() mit toLowerCase().equals() ersetzen. Das drückt die Intention nicht so gut aus und ist außerdem ineffizienter.

Sondern ggf. nach der Eingabe den String umwandeln um sicherzustellen, dass später nur Kleinbuchstaben vorhanden sind.
 
Zurück
Oben