Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: jor am 05.01.06 - 16:46:45
-
Hallo zusammen,
ich habe folgendes Prob: In einem Java-Agenten habe ich mir über eine DocumentCollection Doc's zur Auswertung herangezogen. Ich möchte z. B. abfragen, ob die Maske zutrifft, dazu nutze ich folgenden Code(Auszug)...
String form, firma, pid, testform, a, b;
String tp_form[] = new String[2];
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
db = agentContext.getCurrentDatabase();
pid = (String) session.getEnvironmentString("PID");
ds = db.FTSearch(pid, 0);
tp_form[0] = "RichtigeMaske";
tp_form[1] = "AndereMaske";
para = new String[ds.getCount()];
doc = ds.getFirstDocument();
while (doc != null)
{
form = doc.getItemValueString("Form");
System.out.println("Doc-Maske: " + form);
System.out.println("Vergl.-Maske: " + tp_form[0]);
if ( form == tp_form[0])
{
System.out.println("richtige maske ermittelt");
firma = doc.getItemValueString("Firma1");
System.out.println("Aktuelle Firma: "+firma);
para[0] = firma;
}
}
Aber die Literale werden nicht ausgewertet, obwohl es an Hand der Doc's zu Treffern kommen muss! Was habe ich übersehen, ode rfalsch gemacht??? :-\
Danke schonmal für eure Hilfe!
-
Oh, sorry, aber hat sich echt erledigt! mea culpa :-[
Danke fürs Lesen und der gewollten Unterstützung!
-
Stringvergleiche immer mit equals.
Absolut fundamental und genau dieses Problem weist auf eine ganze Reihe von tiefergreifenden Java-typischen (z.B. Object.hashcode(), object.equals(String other), oder object-identity vs. object-equality) Komplexitäten hin, die unbedingt verstanden werden sollten. Eine sehr gute Darstellung findet man in Joshua Bloch, Effective Java.
Nur wenig mehr als 200 Seiten, die allerdings nicht unbedingt leicht zu lesen sind.
Trotzdem absolut empfehlenswert. Wenn du das verstanden hat, machte dies zumindest bei Java1.2 Zeiten sicher 7% der Zertifizierungsfragen aus.
Da du schon die Lösung gefunden hast, hier eine Vertiefung der Frage ins nächste Level.
http://today.java.net/pub/a/today/2004/04/07/stringsSQ2.html
Die VM hat nämlich einen String-Pool, weshalb manchmal tatsächlich == funktioniert (beide String-Variablen referenzieren tatsächlich auf das gleiche Objekt, weil aus Pool). Manchmal ist das aber nicht so. In deinem Beispiel vermutlich, weil der zweite String aus dem Property eines Objekts gezogen wird.
Praxis: Bei Strings auf jeden Fall immer equals verwenden.
-
Hi kennwort,
danke für deine ausführliche Beschreibung, so hat es sich zugetragen und ich habe es auch so gelöst, auf den Pool bin ich beim Testen rein gefallen.
Als ich den Quelltext gepostet hatte, habe ich den Fehler schon selbst gesehen gehabt (manch mal sieht man den Wald vor lauter Bäumen nicht ;) ).
Da ich keine Löschberechtigung habe, sonst wäre der Eintrag schon weg, muss ich zu meinem
"Was habe ich denn da gemacht?" wohl stehen. ::)
A nice weekend!