2016-10-21 2 views
-2

hallo ich frage mich, warum mein wenn immer Toast mich: "Namen Erfolgreich gespeichert!" Ich versuche alles.mehrfache Prüfung oder, und in wenn Aussage

public void btnSave_Clicked(View view) { 
     TextView txtOname = (TextView)findViewById(R.id.txtOname); 
     TextView txtXname = (TextView)findViewById(R.id.txtXname); 
     String X = txtXname.getText().toString(); 
     String O = txtOname.getText().toString(); 
     if((X!="") && (O!="")){ 
      DatabaseHelper.insertName(getBaseContext(),((TextView)findViewById(R.id.txtOname)) 
        .getText().toString()); 
      DatabaseHelper.insertName(getBaseContext(),((TextView)findViewById(R.id.txtXname)) 
        .getText().toString()); 
      Toast.makeText(this,"names Successfully saved!",Toast.LENGTH_SHORT).show(); 
     }else{ 
      Toast.makeText(this,"E",Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
+0

Überprüfen Sie diese Frage: http://stackoverflow.com/questions/767372/java-string-equals-versus –

+0

Befolgen Sie die Namenskonventionen und vergleichen Sie niemals 'String's mit Gleichheitsoperator. –

+0

@MKönig Namenskonventionen ... – HopefullyHelpful

Antwort

0

Ersetzen Sie Ihre if-Anweisung mit:

if (!x.isEmpty() && !o.isEmpty()) { 
    //code 
} 

Operator == vergleicht Objektverweis.

.equals() vergleicht den Zeichenfolgenwert.

.isEmpty() return true, wenn Stringlänge 0 ist

+1

vielen Dank seine Arbeit gut, vielen Dank noch einmal! –

2

Strings sind Referenztypen in Java und damit die Referenz eines dynamisch erstellten leeren String wird von Ihren Variablen unterschiedlich sein. Eine andere Option zu isEmpty ist equals.

if (!x.equals("") && !o.equals(")) { 
    //code 
} 

Obwohl ich wahrscheinlich mit isEmpty

0

Strings sind Objekte gehen würde. Objektinstanzen (der Wert dahinter) müssen manuell mit einer Methode verglichen werden, um sicherzustellen, dass der Inhalt derselbe ist.

Der ==-Operator vergleicht nur die String-Referenzen ("Adressen"). Wenn Sie also zur Laufzeit 2 Objektinstanzen erstellen, haben sie unterschiedliche Adressen, selbst wenn der Inhalt derselbe ist. Kompilierungszeichenfolgen hingegen werden internalisiert, sie werden in speziellen Speicher abgelegt und Duplikate werden aussortiert.

System.out.println(new String("test") == new String("test")); 

Dies wird falsch ausgeben, da diese 2 Objekte zur Laufzeit erstellt werden. Das neue Schlüsselwort im ersten Beispiel erfordert, dass ein neues Objekt mit einer neuen Adresse erstellt wird.

System.out.println("test" == "test"); 

wird dies wahr drucken, weil sie Stringliterale sind, die zur Laufzeit bekannt sind, werden Sie hier nicht explizit entweder das neue Schlüsselwort besagt. Sie geben einfach an, dass Sie diese Literale irgendwie im Code darstellen möchten, sodass der Compiler sie internalisiert.