Hallo Java-Experten,
ich will mir mit Java ein ganz elementares Vokabel-Abfragprogramm bauen, um mir Java ein wenig näher zu bringen. Ich poste am besten gleich meine beiden Klassen, damit ich gleich auf den Punkt komme:
public class Vocabulary
{
private String English;
private String German;
private String Comment;
public class Question
{
public static void main (String[] args) throws IOException
{
Vocabulary v = new Vocabulary(„zeichnen“,„draw“,"…");
System.out.println(„Hallo\nFolgende Vokabel will ich wissen:\n“+v.getGerman()+"\nGib nun deine Antwort ein:");
String antwort = readLine();
System.out.println("Ergebnis: "+v.getResult(antwort));
}
Nun habe ich folgendes Problem:
Wenn ich die main ausführe und die Lösung eingebe, gibt die „getResult“-Methode immer
false aus (egal ob ich die richtige oder falsche Vokabel angebe)… woran könnte es liegen?
Bitte benutze beim Vergleichen von Strings immer die Methode equals(String).
Also statt: „if (r==English)“ einfach: „if (r.equals(English))“.
Strings sind in Java keine klassischen primitiven Datentypen wie int, float, char usw. sondern Objekte. Bei Objekten überprüft man mit dem ==-Operator, ob es wirklich ein und dasselbe Objekt ist (z.B. String a = „Hallo“ und a == a) und mit equals(Object) ob sich Objekte gleichen also String a = „hallo“, a.equals(„hallo“);
Abgesehen davon werden Strings bzw. deren Inhalt in Java mittels equals bzw. equalsIgnoreCase auf „Gleichheit“ überprüft. Der Operator „==“ vergleicht ob es sich um das gleiche Objekt (im Speicher) handelt. Korrekt müsste die getResult-Methode also lauten:
in Java sind Strings Objekte und keine primitiven Typen.
Der == Operator vergleicht daher Objektreferenzen (also in etwa, ob die beiden Strings an der gleichen Speicheradresse stehen). Um die beiden String-Objekte auf ihre logische Gleichheit zu prüfen, musst Du die equals Methode aufrufen:
public boolean getResult(String r)
{
boolean test;
if (r.equals(English))
{
test=true;
}
else test=false;
return test;
}
Weil der Rückgabewert von equsl (genauso wie vorher mit ==) aber schon boolean ist, kannst Du das sogar noch deutlich vereinfachen:
public boolean getResult(String r)
{
return r.equals(English); // Gib zurück, ob r gleich Englisch ist!
}
(Wenn r == null sein könnte – hier würde man tatsächlich mit == prüfen – würde es beim Methodenaufruf r.equals zu einer NullPointerException kommen. Ich glaube zwar, dass das hier nicht der Fall sein kann, aber in sauberem Code sollte man das trotzdem auf jeden Fall verhindern.)
strings kann man nicht einfach mit == vergleichen, da man dann nicht den inhalt, sondern die objekte vergleicht! da es 2 unterschiedliche objekte sind, liefert es immer false!
versuche in deinem if einfach mal folgendes:
if (r.equals(English)
return true;
return false;
das sollte dann schon eher funktionieren (und falls r null sein kann, einfach in der if davor noch abfragen, ob != null, damit du keine NullPointerException bekommst!
Dort machst du einen Referenz-Vergleich auf 2 Strings. dieser wird immer falsch sein da die referenzen von 2 unterschiedlichen objekten immer unterschiedlich sind.
Richtig wäre diese Implementierung:
public boolean getResult(String r)
{
return r.equals(English);
}