Problem mit if-anweisung - bin am verzweifeln

philbo

Mitglied
Hallo...
ich bin am verzweifeln...
und zwar habe ich zwei Textfelder, die ausgelesen werden, je nachdem, ob in den Textfeldern etwas drinsteht, oder nicht, sollen die Anweisungen ausgeführt werden...
hier ein ausschnitt aus dem Quelltext:
Code:
lfdnr = tf_lfdnr.getText();
stichwort = tf_stichwort.getText();[

   if (stichwortsuche == true) {
           if (stichwort != ""){
	   strSQL = "SELECT lfdnr, Typ, Kurzbezeichnung, Beschreibung, Raumnr, Standort, Ausleiher, FORMAT(Ausleihdatum, 'dd.mm.YYYY') FROM Schulungsunterlagen WHERE Kurzbezeichnung LIKE '%"+stichwort+"%'";
}
            if (stichwort == ""){
	strSQL = "SELECT lfdnr, Typ, Kurzbezeichnung, Beschreibung, Raumnr, Standort, Ausleiher, FORMAT(Ausleihdatum, 'dd.mm.YYYY') FROM Schulungsunterlagen";
}
}
else 
    if (stichwortsuche == false){
          if (lfdnr != ""){
	strSQL = "SELECT lfdnr, Typ, Kurzbezeichnung, Beschreibung, Raumnr, Standort, Ausleiher, FORMAT(Ausleihdatum, 'dd.mm.YYYY') FROM Schulungsunterlagen WHERE lfdnr="+lfdnr;
}
           if (lfdnr == ""){
	strSQL = "SELECT lfdnr, Typ, Kurzbezeichnung, Beschreibung, Raumnr, Standort, Ausleiher, FORMAT(Ausleihdatum, 'dd.mm.YYYY') FROM Schulungsunterlagen";
}

Allerdings kommt die Bedingung lfdnr == "" nie zustande, obwohl in dem Textfeld nichts drinsteht. Es wird trotzdem der Teil, der in lfd != "" steht ausgeführt.
Hat da jemand eine Idee
Danke und Gruß
Philipp
 
Ersetze

if (lfdnr == "")

durch

if (lfdnr == null || lfdnr.length() == 0)

Kein Text kann auch bedeuten, dass NULL drin steht...
 
Super...danke, so klappt es!
Hatte es vorhin mit if (tf_lfdnr.getlength() == 0) probiert, aber das funktionierte natürlich nicht, weil er da die max Länge des Textfeldes hat und nicht die tatsächliche (momentane).

Gruß
Philipp

P.S.: Könnte man die gesamte IF-Anweisung noch verkürzen? Kommt mir so lang vor und mein gesamter Quelltext ist schon so dermaßen aufgebläht, dass ich selber ständig suchen muss :-(

Danke
Philipp
 
Original geschrieben von Snape
Ersetze

if (lfdnr == "")

durch

if (lfdnr == null || lfdnr.length() == 0)

Kein Text kann auch bedeuten, dass NULL drin steht...

Viel wichtiger ist der Hinweis das mann Strings nicht mit einem == Operator vergleicht.


Code:
String myString = "einString";
if(myString == "einString") 
 System.out.println("passt");
else 
 System.out.println("passt nicht");

Es kann "passt nicht" rauskommen und dies ist auch vollkommen korrekt. Weil beim
Vergleichsoperator == nicht der Inhalt sondern die Refernzgleichheit geprüft wird.
Also letztendlich solltest du niemals Strings über den Vergleichsoperator "==" prüfen,
da dies zu unerwarteten Ergebnissen kommt.

Code:
String myString = "einString";
if(myString.equals("einString"))
    System.out.println("passt");
else 
 System.out.println("passt nicht");

Wird demnach immer das erwartete Ergebnis bringen.

Code:
if(myString ==null || myString.equals("") )
bzw
if(myString == null || myString.length() == 0)
Sind demnach austauschbar.

Dein Hauptfehler liegt beim benutzen von ==


gekürzte Version:

Code:
String strSQL = "SELECT lfdnr, Typ, Kurzbezeichnung, Beschreibung, Raumnr, Standort, Ausleiher, FORMAT(Ausleihdatum, 'dd.mm.YYYY') FROM Schulungsunterlagen";   if (stichwortsuche == true) {
           if (stichwort!=null || !stichwort.equals(""))
        	   strSQL+ = " WHERE Kurzbezeichnung LIKE '%"+stichwort+"%'";
}
else 
      if(stichwortsuche == false){
          if (lfdnr !=null |< !lfdnr.equals(""))
        	strSQL += " WHERE lfdnr="+lfdnr;
    }
}
 
Dankeschön!
Das mit dem Strings nicht mit == benutzen wusste ich nicht!

Werde deine gekürzte Version gleich mal einbauen..
Gruß
Philipp
 
Gut dann werde ich noch ein bischen weiter ausholen was es mit dem == Operator aufsich hat.

Es gibt in Java 2 verschiedene Typen.
primitive Typen und Typen die von Object erben, also alle Objecte.

Für die primitiven Typen long, int, char, double ...
erfolgt eine Wertprüfung: long a = 300; int b = 300;
(a==b) true

Bei Objecten erfolgt eine Prüfung der Referencen:

Car myCar = new Car(1.90,3.50);
Car fathersCar = new Car(1.90,3.50);
Car girlfriendsCar = myCar;

myCar==fathersCar ist false, obwohl beide die selben Werte beeinhalten (breite 1.90 länge 3.50),
es wird jedoch nicht der Wert der Objecte sondern die Referenzgleichheit geprüft.
Weshalb
girlsfriedsCar == myCar true ist.

Bei Strings ist das genauso da String kein primitiver Typ ist, sondern auch ein String sich von
Object ableitet.
Deshalb wird auch hier ein Refernztest durchgeführt:

String myString = "hallo";
String otherString = "hallo";
String copyString = myString;

myString == copyString ist true;
myString == otherString ist eigentlich false.

Hier kann es jedoch verwirrend werden. Denn die VM legt den String in einen StringPool und prüft beim Instanzieren eines Strings ob genau dieser Inhalt im StringPool vorhanden ist, und wenn ja dann wird darauf referenziert. Da mann aber sich nicht darauf verlasssen kann, weil das VM Optimierende interne geschichte ist, ist der otherString == copyString Ausdruck so
gefährlich und kann sowohl false als auch true zurückgeben.
Deshalb sollte mann Werteprüfungen bei Strings immer mit .equals() testen.
 
Hmm, jetzt wo du das alles erwähnst, erinnere ich mich dunkel, das schonmal gelesen zu haben...das Problem bei mir ist einfach nur, dass ich letztes Jahr 3 Monate was mit Java gemacht habe, dann knapp ein Jahr gar nix mehr und mich jetzt wieder bis ende Juli damit beschäftigen muss. In der Zeit verlernt und vergisst man viel, besonders wenn man sich nicht ständig mit dem Thema Java beschäftigt.

Danke für die Ausführungen!
Philipp
 
Ich bin es nochmal...
Seltsam...aber der Teil
Code:
if (stichwort != null || !stichwort.equals("")){
	strSQL += " WHERE Kurzbezeichnung LIKE '%"+stichwort+"%'";
}

Wird immer durchlaufen, auch wenn stichwort auf jeden Fall null ist, ebenso bei der anderen Schleife mit lfdnr.
Hast du da evtl ne Erklärung für
 
Original geschrieben von philbo
Ich bin es nochmal...
Seltsam...aber der Teil
Code:
if (stichwort != null || !stichwort.equals("")){
	strSQL += " WHERE Kurzbezeichnung LIKE '%"+stichwort+"%'";
}


Wird immer durchlaufen, auch wenn stichwort auf jeden Fall null ist, ebenso bei der anderen Schleife mit lfdnr.
Hast du da evtl ne Erklärung für

Ich weiss ja nicht wo stichwort her kommt.

if (stichwort != null || !stichwort.equals(""))

schreib es um in:
if (stichwort != null && !stichwort.equals(""))
 
Zurück