Input == String => false

P

Penta

Boardmaler
Hallo Leute,
ich habe mir eine eigene Klasse zum einlesen der Tastatur gebaut und habe dort nun follgendes Problem:
Wenn ich ein String einlese und diese mit einem initialisierten String vergleiche, der den gleichen Inhalt hat, gibt er mit ein false.
Ich liste hier mal die Codes auf:
Input:
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Input {

    public static String readString(){
        String line = "";
        String val = "";
        try {
          BufferedReader is = new BufferedReader(
            new InputStreamReader(System.in));
          line = is.readLine();
          val = line.intern();
        } catch (IOException e) {
          System.err.println("Unexpected IO ERROR: " + e);
        }
        return val;
    }

}
Und hier mal meine Testing.java:
Code:
public class Testing {

    public static void main(String[] args) {

        String str1 = "test";
        String str2 = Input.readString();
        System.out.println("Step 0:");
        String str3 = str2+"test2\n";
        System.out.print(str3);
        System.out.println("Step 1:");
        if(str1 == str2){
            System.out.println("gleich");
        }else{
            System.out.println("ungleich");
        }
        
        str2 = str2.replaceAll("\n", "");
        System.out.println("Step 2:");
        if(str1 == str2){
            System.out.println("gleich");
        }else{
            System.out.println("ungleich");
        }  
    }
}
 
Kann geclosed werden, hab nach lange Suche, den dummen Fehler gefunden. -.-
 
Hatte beim einstieg in Java das gleiche Problem :)
Strings werden in Java mit == auf Referenzgleichheit und nicht auf Wertegleichheit geprüft.
Für den Wertevergleich immer equals nutzen!

Ich finde es nur leider blöd, dass sich dies nicht ändern wird...

T-Virus
 
Hatte beim einstieg in Java das gleiche Problem :)
Strings werden in Java mit == auf Referenzgleichheit und nicht auf Wertegleichheit geprüft.
Für den Wertevergleich immer equals nutzen!

Ich finde es nur leider blöd, dass sich dies nicht ändern wird...

T-Virus
Da equals Teil der object-Klasse ist (Oberklasse aller Klassen), kannst du es auch überschreiben und damit das Problem umgehen.
 
Du müsstest eine Methode equals in deine Klasse aufnehmen.
In etwas so:
Code:
	/*
	 * (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		return true; // Check this object against another one for equality.
	}
Allerdings ist das bei deinem Problem völlig nutzlos, da die String-Klasse die equals-Methode schon von Haus aus überschreibt... http://www.docjar.com/html/api/java/lang/String.java.html

Grundsätzlich gilt für Strings (und andere Object): Für Vergleiche auf Wertebene immer equals verwenden. Für Vergleiche auf Referenzen (unveränderliche Pointer) sollte man "==" verwenden.

Weitere Informationen findest du hier: http://openbook.galileocomputing.de...04_002.htm#mj5ee730cda1f64998edf27bd440d36bf1

cu
 
Naja, was nighT geschrieben hat, war auch relativ falsch, das Problem kann er damit gar net lösen. Gleicheit prüft man mit equals. Punkt. Objektidentität mit ==. Primitive Typen leider doch mit ==, weils eben keine Objekte sind (int, float, ... Doofes Java..)

Eigene Objekte sollten equals sauber implementieren. Die Standardimplementierung aus Object prüft auf Objektidentität. Also wenn man nix anderes programmiert, dann wird bei equals intern == verwendet.
 
Naja, was nighT geschrieben hat, war auch relativ falsch, das Problem kann er damit gar net lösen. Gleicheit prüft man mit equals. Punkt. Objektidentität mit ==. Primitive Typen leider doch mit ==, weils eben keine Objekte sind (int, float, ... Doofes Java..)

Eigene Objekte sollten equals sauber implementieren. Die Standardimplementierung aus Object prüft auf Objektidentität. Also wenn man nix anderes programmiert, dann wird bei equals intern == verwendet.

So sieht es aus.
Finde ich trotzdem doof da bestimmt über 90% aller Vergleiche nur auf den Wert und nicht auf die Referenz geprüft werden.
In .Net hat man dies besser gelöst.
Dort gibt es die Methode ReferenceEqual um die Referenzgleichheit zu prüfen.
Werte können dort zwar auch mit Equals aber eben auch mit == geprüft werden.

Hier macht Java eigentlich einen dummen Fehler.

T-Virus
 
Fehler würde ichs nicht nennen auch die .Net Methode ist gefühlt nicht viel besser. In Smalltalk gibts ~= und =. Und man kann beide so programmieren wie man möchte weils ganz normale Methoden sind.
 

Ähnliche Themen

"non blocking console input" wieder rückgängig machen?

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Shellskript - Fehler in Cron

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Java 1.3 ORO Regex Problem

Zurück
Oben