Hallo,
ich habe aktuell ein Problem mit NotesFactory.createSession
try
{
NotesThread.sinitThread();
NotesFactory.createSession( "", "username", "password" );
}
catch ( Exception e )
{
System.out.print( "EXCEPTION: " + e.toString() + "\n" );
}
finally
{
NotesThread.stermThread();
}
Ich bekomme bei createSession die Exception:
"NotesException: Invalid user name/password"
Wenn ich jedoch einen Servernamen angeben (in meinem Fall localhost oder 127.0.0.1), tritt dieser Fehler nicht auf. Damit scheint Username/Passwort ja in Ordnung zu sein - oder? Notes.jar steht auch im Classpath. Mir fällt langsam nix mehr ein :(
Ich hoffe jemand von euch kann mir weiter helfen.
Danke.
Schon mal in die Designer Hilfe zur NotesFactory geschaut? Aufruf ist
createSession(null, userString, passwordString)
Hint: "" != null
@Thomator
Bist du dir dessen ganz sicher, dass dem so ist. Meines Verständnis von Java ist zwischen deinem Code und Session s = NotesFactory.createSession(null, "user", "password");
kein Unterschied. Wenn du eine Variable in Java definierst, dann machst du eigentlich einen Verweis auf ein Objekt. Deshalb müsste meiner Meinung nach beides das selbe sein. Werde das mal debuggen und dann Bescheid geben.
Grüße
Ralf
Ich frag mich nur, wie die das rausfinden, dass es sich um einen String handelt ???
Sehr ungewöhnlich.
Beides gab für gecastetes Null (erstmalig, dass ich dieses Konstrukt überhaupt gesehen habe) oder String notInitialized = null das gleiche wie null.
Eine Methode mit String als Parameter wird natürlich auch mit null aufgerufen.
package aja;
public class FindTypeAtRuntime {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("1. Beispiel: Null gekastet");
// TODO Auto-generated method stub
System.out.print("instanceof: ");
if (((String) null) instanceof java.lang.String) {
System.out.println("ein String");
} else {
System.out.println("kein String");
}
System.out.print("getClass ");
try {
System.out.println(((String) null).getClass().getName());
} catch (NullPointerException e) {
System.out.println("throws nullPointerException");
}
callMeWithStringParam((String)null);
System.out.println("2. Beispiel: lokale String Variable, nicht initialisiert");
String aNullString = null;
System.out.print("instanceof: ");
if (aNullString instanceof java.lang.String) {
System.out.println("ein String");
} else {
System.out.println("kein String");
}
System.out.print("getClass ");
try {
System.out.println(aNullString.getClass().getName());
} catch (NullPointerException e) {
System.out.println("throws nullPointerException");
}
callMeWithStringParam(aNullString);
System.out.println("3. Gegentest. Eine initialisierte Stringvariable");
String aString = "a";
System.out.print("instanceof: ");
if (aString instanceof java.lang.String) {
System.out.println("ein String");
} else {
System.out.println("kein String");
}
System.out.print("getClass ");
System.out.println(aString.getClass().getName());
callMeWithStringParam(aString);
System.out.println("3.a Gegentest. Aufruf mit null, ungecastet");
callMeWithStringParam(null);
}
private static void callMeWithStringParam(String param) {
System.out.println("callMeWithStringParam(String param) aufgerufen");
}
}
ergibt:
1. Beispiel: Null gekastet
instanceof: kein String
getClass throws nullPointerException
callMeWithStringParam(String param) aufgerufen
2. Beispiel: lokale String Variable, nicht initialisiert
instanceof: kein String
getClass throws nullPointerException
callMeWithStringParam(String param) aufgerufen
3. Gegentest. Eine initialisierte Stringvariable
instanceof: ein String
getClass java.lang.String
callMeWithStringParam(String param) aufgerufen
3.a Gegentest. Aufruf mit null, ungecastet
callMeWithStringParam(String param) aufgerufen
Ralf,
achso. Jetzt beginne ich zu kapieren.
Wenn er Methoden mit diesen Signaturen
(null, String, String)
oder
(String, String, String)
zur Auswahl hat, dann nimmt er mit (String) null Auswahl 2 und mit null Auswahl 1.
Du kannst aber in Java z.B. keine Methode mit der Signatur null erzeugen. Das läßt der Compiler nicht durch. Wenn du eine Methode mit der Signatur (Object val) nimmst und eine gleichnamige Methode mit String als Signatur nimmt er die mit String.
String ist eine finale Klasse. Wenn es eine spezifischere vererbte Klasse von String gäbe, würde Methode method (StringVererbt) aufgerufen.
Leicht verwirrend, aber es ist so.
in normalen Java:
System.out.println("3.a Gegentest. Aufruf mit null, ungecastet");
callMeWithStringParam(null);
ruft diese Methode auf:
private static void callMeWithStringParam(String param) {
System.out.println("callMeWithStringParam(String param) aufgerufen");
}
und nicht die, auch wenn die vorhanden ist:
private static void callMeWithStringParam(Object param) {
System.out.println("callMeWithStringParam(String param) aufgerufen");
}
...weil nämlich String extends Object. In solchen Situationen wird die spezifischere Klasse ausgewählt.
Das hier...
private static void callMeWithStringParam(String param) {
System.out.println("callMeWithStringParam(String param) aufgerufen");
}
private static void callMeWithStringParam(StringBuffer param) {
System.out.println("callMeWithStringParam(String param) aufgerufen");
}
... läßt der Compiler nicht durchgehen (ambigious), da keine der Klassen von der anderen erbt.
Und der Aufruf der Methode wird erst während der Laufzeit (nicht beim compilen) aufgelöst (late binding).
Ich frag mich nach wie vor wie die das hingekriegt haben.
Gruß Axel