Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Problem mit createSession

<< < (3/4) > >>

flaite:
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.

--- Code: ---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");
}

}

--- Ende Code ---

ergibt:

--- Code: ---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

--- Ende Code ---

Glombi:
Das sagt die KBASE:

Problem

The following message occurs when compiling a Java application, even though the code appears to match examples in the Domino Designer Help:

"The method createSession(String, String, String) is ambiguous for the type NotesFactory"
The Help for Notesfactory describing createSession states:

"createSession(null, userString, passwordString) -- Internet access is granted to the session if the password matches the Internet password in the user's Person record in the Domino Directory."

However,
The following code, which is intended to open a session on the local Domino server for the user and password specified, fails with the above error:

Session session = NotesFactory.createSession(null, "John Doe", "mypassword");


Solution

This issue has been reported to Quality Engineering, and is currently under investigation.
The correct syntax (which is specified correctly in the full specification of the createSession() method at the end of the Help document, as well as in the examples, shows the first parameter in this method must be a string.

The following shows the corrected code for the example described above:
 Session session = NotesFactory.createSession((String)null, "John Doe", "mypassword");

Andreas

Ralf_M_Petter:
Hallo Axel!

Danke für die Mühe sehr interessant sich bestätigt zu sehen., aber hast du auch probiert, ob es überhaupt so ist wie Thomator behauptet, dass createSession(null,user,pwd) nicht funktioniert. Es ist nämlich in der Hilfe genauso beschrieben. Glaube nicht, dass so etwas Grundlegendes nicht funktioniert. Wobei diese Vorgehendsweise ja sowieso nur am Server zulässig ist.

Habe jetzt erst die Erklärung von Andreas gesehen. Ja jetzt ist es klar, sie bekommen einen Umwandlungsfehler. Ich dache wir reden von einem Ausführungsfehler, bzw. das es nicht funktioniert wenn man es so macht. Man lernt immer wieder was dazu.

Grüße

Ralf

flaite:
Ich kapier das von der Java Seite nicht.
Vielleicht ist das eine JNI (Java Native Interface, die Verbindung mit C) Geschichte?
Vielleicht macht es bei Parametern, die an JNI übergeben werden Unterschiede, ob (String) null oder null?
Was ich mir bestätigen wollte war, dass es in Java keine speziellen Typen von null gibt (in String gekasteter String, simples null, etc.).
Nur ist es eben auf der Bytecode-Ebene logisch und mehr als wahrscheinlich, dass es unterschiedlich aussieht. Und vielleicht reagiert JNI darauf.
Local Access auf Domino über Java läuft ja über JNI.
 

Ralf_M_Petter:
Was verstehst du an der Erklärung von Andi nicht?

Es liegt nicht an der Ausführung, es geht nur darum, dass der Compiler die Signatur nicht erkennen kann. Lotus hat das Verbrechen gemacht eine Methode mit dem selben Namen zu machen, die die selbe Anzahl an Parametern hat. Der Compiler kann daher die Methoden nur anhand des Typs der Variablen unterscheiden. Wenn du jetzt aber direkt null hineinschreibst, kann der Compiler nicht unterscheiden, wenn du aber (String)null schreibst, dann wird zwar das null Objekt (ist falsch Null ist kein Objekt) nicht verändert aber der Compiler weiß dass er die Methode mit dem String als ersten Parameter verwenden muß. Als0 (String)null==null aber bei (String)null weiß der Compiler welche Methode er nehmen soll und bei null weiß er es nicht und bringt daher einen Übersetzungsfehler.

Grüße

Ralf

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln