Java Android: String aus Bundle Objekt vergleichen

ali7566

Lieutenant
Registriert
Feb. 2007
Beiträge
960
Hallo,

ich weiß nun leider nicht ob mir die Uhrzeit hier zu schaffen macht oder ob ich etwas noch nicht so ganz gerafft habe. :D

Ich habe in Android zwei Acitivties, von der einen Activity übergebe ich ein explizites Intent an die andere Activity. Wenn ich nun in der zweiten Activity den Wert auslesen möchte den ich in der ersten Activity gesetzt hatte so kommt er zwar auf der anderen Seite an und ich kann laut Debugger auch exakt die Werte ausgeben die dafür gedacht waren, jedoch wenn ich diese in einer if-Abfrage als vergleich (==) darstelle wird der exakte String einfach nicht erkannt!

Habe zur Kontrolle den String auch noch in ein EditText geschrieben um sicher zu gehen das ich genau all die Werte bekomme die ich auch wollte und es ging problemlos.

Hier jedoch mal mein Codeausschnitt:

Code:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.weiterleitung);
		
               Bundle extras = new Bundle();

		try
		{
			extras = getIntent().getExtras();
		}
		catch(Exception e)
		{
			Toast.makeText(this, "Es ist ein Fehler aufgetreten", Toast.LENGTH_SHORT).show();
		}
		
		final TextView txTitel = (TextView) findViewById(R.id.tv_title);
		String temp_str = extras.getString("callerView").toString();
		
		
		if(extras != null)
		{
			temp_str ="sms";
			
			if(temp_str == "sms")
			{
				txTitel.setText("Bitte Telefonnummer für SMS eingeben:");
				actionFlag= 1;
			}
			
			else if(temp_str == "email")
			{
				txTitel.setText("Bitte adresse für Email eingeben:");
				actionFlag= 2;
			}
			
			else if(temp_str == "call")
			{
				txTitel.setText("Bitte Telefonnummer für Telefonat eingeben:");
				actionFlag= 0;
			}
			
			else if(temp_str == "browse")
			{
				txTitel.setText("Bitte website eingeben:");
				actionFlag= 3;
			}
		}
			
			
		}

Ich glaube da sitzt irgendwo ein kleiner Fehlerteufel drinnen den ich nicht sehe -.-

Gruß Ali.
 
Benutz die Methode equals(string) zum vergleichen von zeichenketten, nicht ==.

Begründung (kein bock das jetzt zu erklären):
http://www.java-blog-buch.de/0302-strings-vergleichen/

Im groben liegt es daran, dass Strings Objekte der Klasse String sind und andere Datentypen wie int eben nur primitive Datentypen sind.
== prüft bei Objekten auf Identität, nicht Gleichheit.
 
Zuletzt bearbeitet:
ahh mist...dieser dauernde wechsel zwischen C# wo die oben genannte Methode kein Problem ist und Java lässt einen ab und zu in Fettnäppchen tretten ;)

Aber vielen Dank, hat jetzt funktioniert!

Gruß Ali.
 
Zuletzt bearbeitet:
Das Problem (sofern man es so nennen möchte) gibt es in C# auch!
Für den String mag der == Operator so implementiert sein, dass er auf Gleichheit prüft, bei anderen Klassen ist dies aber nicht immer so. Grundsätzlich bedeutet == auch in C# eine Prüfung auf Identität.
Gleichheit immer mit equals prüfen, auch in C#.
Referenzsemantik und ihre Tücken :)
 
Also in C# hab ich eben nochmal ein kleines Projekt angeworfen, da geht es (Siehe Anhang). Meinen wir vielleicht was anderes ?

Gruß Ali.
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    89,2 KB · Aufrufe: 154
Timmey hat doch geschrieben, dass das für Strings so implementiert ist. Was aber für einen complexeren, evtl. sogar selbst definierten Datentyp?
haus == haus2? Müsste das selbe Haus sein... Also gleiches beim Notar eingtragenes Grundstück usw
haus.equals(haus2)? Ein Haus mit identischen Eigenschaften... Grundstück gleicher Größe usw usf

Hoffe richtig und klarer :)

e: etwas zu spät ^^
 
Zuletzt bearbeitet:
TheCadillacMan schrieb:
Strings in Java nie mit ==, sondern immer mit .Equals() vergleichen! (== macht einen Referenzvergleich, Equals einen Wertvergleich.)

Es kann Anwendungsfälle geben, in denen == funktioniert und Vorteile bringt. Das ist aber die große Ausnahme und praktisch zu vernachlässigen. equals() schreibt sich in Java übrigens klein. Die Namensregeln bei C# sind echt daneben..
 
Laufzeitvorteile oder welche Art von Vorteilen meinst du?
 
Timmey92 schrieb:
Laufzeitvorteile oder welche Art von Vorteilen meinst du?

Ja, String#equals() kann Performanzprobleme machen, aber wie immer sollte man an der Stelle nur optimieren, wenn es sich als wirklich notwendig herausstellt.
 
soares schrieb:
Es kann Anwendungsfälle geben, in denen == funktioniert und Vorteile bringt. Das ist aber die große Ausnahme und praktisch zu vernachlässigen.
Klar, dass es funktionierten kann. Darauf verlassen sollte man sich aber nicht.
Dass ein Referenzvergleich Laufzeitvorteile gegenüber einem Wertvergleich bringt, liegt in der Natur der Sache. Nur will man in 99% der Fälle eben einen Wertevergleich. Du tankst ja auch keinen Diesel wenn dein Auto ein Benziner ist nur weil der Diesel billiger ist. ;)
soares schrieb:
equals() schreibt sich in Java übrigens klein. Die Namensregeln bei C# sind echt daneben..
Ich benutze eigentlich immer die Konventionen der entsprechenden Sprache. Das Equals groß zu schreiben war wohl ein "freudscher Verschreiber". ;)
Außerdem könnte ich dir auch einige Sachen nennen die mir an Java nicht gefallen, aber das tut hier überhaupt nichts zur Sache.

Überhaupt:
Dass man Strings in C# mit == vergleichen kann finde ich absolut logisch. Grundsätzlich vergleicht man Wertetypen in C# mit ==. String ist zwar ein Referenztyp verhält sich allerdings wie ein Wertetyp, also ist == nur logisch.
 
Man muss sich auch fragen: Interessiert mich wirklich, ob es sich um die selbe Instanz oder den selben Wert handelt? Mir fallen bei Strings spontan nicht wirklich ein Fall ein, bei denen ich auf Instanzgleichheit prüfen möchte - und wenn doch, würde ich wohl eher das ändern, dass es nicht um die Instanzgleichheit einer String-Instanz geht.

Im Grunde ist es an Java (und auch anderen Sprachen) unschön, dass der Gleichheitsoperator == unterschiedliche Bedeutungen haben kann, bzw. man kann schon sagen, dass er immer die Identität meint, aber bei Wertetypen die Identität durch Wertegleichheit gegeben ist... aber wer spricht da schon vom Identitätsoperator?
 
TheCadillacMan schrieb:
Klar, dass es funktionierten kann. Darauf verlassen sollte man sich aber nicht.

Das ist kein Glücksspiel. Wenn man es braucht, kann man es so programmieren, dass man den == Operator verwenden kann.

TheCadillacMan schrieb:
Dass ein Referenzvergleich Laufzeitvorteile gegenüber einem Wertvergleich bringt, liegt in der Natur der Sache. Nur will man in 99% der Fälle eben einen Wertevergleich.

Wie gesagt dürfte das ein sehr spezifischer Anwendungsfall sein. Normalerweise sollte man equals verwenden. Darüber besteht Konsens.
 
Zurück
Oben