Problem mit java.io.*

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 Vocabulary(String German, String English, String Comment)
{
this.English=English;
this.German=German;
this.Comment=Comment;
}

public String getGerman()
{
return German;
}

public String getEnglish()
{
return English;
}

public String getComment()
{
return Comment;
}

public boolean getResult(String r)
{
boolean test;
if (r==English)
{
test=true;
}
else test=false;
return test;
}
}

import java.io.*;

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

public static String readLine()
{
String s="";
try
{
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader keyboardInput = new BufferedReader(input);
s=keyboardInput.readLine();
}
catch(Exception e)
{
System.out.print("Fehler, Grund: "+e);
}
return s;
}
}

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?

Mit freundlichen Grüßen MOD1991

Hi, getResult darf den Vergleich nicht mittels == durchführen, sondern mittels equals-Methode. Dann sollte das klappen.

Lies mal in der Java-Insel dazu nach.

Hallo,

du hast einen typischen Anfängerfehler gemacht:
== überprüft, ob die Texte auf das gleiche Objekt verweisen, was sie niemals tun (Siehe http://openbook.galileocomputing.de/javainsel9/javai… ).

Du musst also schreiben:
________________________
public boolean getResult(String r)
{
boolean test;
if (r.equals(English)) // > http://de.wikibooks.org/wiki/Java_Standard:_Variable…

Ich hoffe, dass ich alle Fragen beantworten konnte. Wenn nicht, schreibe gerne nochmal.

Viele Grüße

tincian

Danke für die schnelle Antwort, jetzt verstehe ich endlich den Unterschied zwischen der „==“- und der „equals“-Methode :smile:
Nun klappt alles wie gewünscht

Hi, getResult darf den Vergleich nicht mittels == durchführen,
sondern mittels equals-Methode. Dann sollte das klappen.

Lies mal in der Java-Insel dazu nach.

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

Grüße

Hallo

=============== Böse =================
if (r==English)

So vergleicht man Strings nicht

Besser:
public boolean getResult(String r)
{
boolean test = false;

if (r.equals(English))
{
test=true;
}

return test;

}

Und Variablen bitte klein schreiben…
Torsten

Hi.

Wenn Java ab Version 6 verwendet wird gibt’s auch die Variante die Klasse Console zu verwenden. Siehe auch http://www.java2s.com/Code/Java/JDK-6/JavaConsolerea…

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:

public boolean getResult(String r) {
return r.equals(English) ? true : false;
}

Tom

Hallo MOD1991,

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

Schöne Grüße,

Manfred

@Τhomas Bernһardt:

(bool) ? true : false

ist immer äquivalent zu

bool

-)

hallo,

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!

== sollte man nicht fuer einen String Vergleich nutzen, sondern immer stringA.equals(stringB)

== ist bei String nur dann gleich, wenn beide auf die selbe Referenz zeigen.

Hallo MOD1991

Der Fehler light in der getResult()-Methide

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

ich hoffe ich konnte weiter helfen