2012-04-03 6 views
0

Ich verwechselte mit erweitert, ich ging mit der Theorie n löste einige Beispiele, Aber wenn ich zu meinem Hauptprojekt komme noch ich etwas falsch machen und ich bin nicht in der Lage, es zu finden .Wie zu verwenden erstreckt sich auf den Wert Super-Klasse

Kann mir jemand helfen.

ConnectionServiceImpl wird von RPC

aufgerufen, wenn der Client die COnnectionServiceImpl ruft die connectionParameter gesetzt .Ich es in dem durch die Anzeige geprüft

Map<String, String> 

aber als zweiter RPC-Aufruf an die ObjectStore von Client getan es gibt mir Fehler NullPointerException für die gleiche parameter, die in der super Klasse

gesetzt wurde 10
public class ConnectionServiceImpl extends RemoteServiceServlet{ 
// some code including initialization 
private ConnectionParameter connectionParameter ; 
private Map<String, String> parameter; 
public String connection() { 
     connectionParameter = new ConnectionParameter("abc","xyz",repositoryName); 
     setConnectionParameter(); 
     setSession(); 
     return getConnected(); 
    } 

protected Map<String, String> getConnectionParameter() { 
Iterator iterator = parameter.keySet().iterator(); 
     while(iterator.hasNext()){ 

       String key = iterator.next().toString(); 
       String value = parameter.get(key); 
       System.out.println("key " + key + " value "+value); 

    } 
      return parameter; 
} 

private void setConnectionParameter(){ 

    this.parameter=connectionParameter.getParameter(); 
} 
} 

Diese obige Klasse funktioniert gut.

jetzt,

public class ObjectStore extends ConnectionServiceImpl { 
// some code 
public ObjectStore() { 
    // TODO Auto-generated constructor stub 
    this.parameter = getConnectionParameter(); **<--- NullPointer Error** 
      } 
} 

Kann das jemand erklären oder sagen, den Fehler

public class ConnectionParameter { 

    private String repositoryID; 
    private static String username; 
    private static String password; 
    private static String AtomPubUrl; 
    private static String bindingType; 
    private Map<String, String> parameter = new HashMap<String, String>(); 

    public ConnectionParameter(String username, String password, 
      String repositoryId) { 
     // TODO Auto-generated constructor stub 

     AtomPubUrl = "http://192.168.1.32:9083/CaseManager/resources/Service"; 
     bindingType = BindingType.ATOMPUB.value(); 
     this.username = username; 
     this.password = password; 
     this.repositoryID=repositoryId; 

     setConnectionParameter(); 
    } 
     Map<String, String> getParameter() { 
     return parameter; 
    } 

    private void setConnectionParameter() { 
     parameter.put(SessionParameter.USER,username); 
     parameter.put(SessionParameter.PASSWORD, password); 

     parameter.put(SessionParameter.ATOMPUB_URL,AtomPubUrl); 
     parameter.put(SessionParameter.BINDING_TYPE, bindingType); 

     parameter.put(SessionParameter.REPOSITORY_ID, repositoryID); 
    } 

} 

Stacktrace

java.lang.NullPointerException 
    at com.server.ConnectionServiceImpl.getConnectionParameter(ConnectionServiceImpl.java:107) 
    at com.server.ObjectStore.<init>(ObjectStore.java:27) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at java.lang.Class.newInstance0(Class.java:355) 
    at java.lang.Class.newInstance(Class.java:308) 
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153) 
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428) 
+0

hinzufügen Stack-Trace sowie pls und mögliche weitere Details in Code – fmucar

+0

Wie sieht der Elternklassenkonstruktor aus? Das Problem wird verschwinden, wenn der Standardkonstruktor der übergeordneten Klasse den Verbindungsparameter initialisiert. – Scorpion

+0

@Scorpion: Es gibt keinen Konstruktor. – NewCodeLearner

Antwort

2

Sie scheinen ein Problem mit der Initialisierungsreihenfolge und ownerhsip der Mitgliedsfelder zu haben.

  1. Haben Sie ConnectionServiceImpl.parameter in seinem Konstruktor initialisiert? Du zeigst dort keinen Konstruktor - hast du einen? Wenn nicht, wird parameter direkt nach dem Erstellen des Objekts nicht initialisiert. Was bedeutet, dass der Aufruf getConnectionParameter vor connection Ihnen einen Nullzeiger gibt. (Obwohl es nicht zu einer NPE führen sollte - ist der Code, den Sie uns zeigen, wirklich eine NPE, wie Sie behaupten?).

  2. Aus dem obigen folgt, dass Ihr Anruf zu getConnectionParameter vom Konstruktor ObjectStore ein Fehler ist, es sei denn, Sie ConnectionServiceImpl.parameter vor (in der übergeordneten Klasse Konstruktor) initialisiert.

  3. Anscheinend haben entweder ein Feld parameter in ObjectStore genannt (die ConnectionServiceImpl.parameter dupliziert, so sehr mutlos ist) oder ConnectionServiceImpl.parameter - deren Erklärung ist in Ihrem Code gezeigt - ist private nicht, so zugänglich von der Unterklasse, und Sie versuchen, es vom Unterklassenkonstruktor zu initialisieren (was im Allgemeinen falsch ist - die Basisklasse sollte sich darum kümmern, ihre Felder richtig zu initialisieren). Und wenn dies der Fall ist, versuchen Sie tatsächlich "circular initialization": das Feld in der Unterklasse mit einem eigenen Wert zu initialisieren, der über den Oberklassen-Getter genommen wird, was töricht ist.

+0

Ich habe einige Details hinzugefügt. Laut mir, wenn der Client die ConnectionServiceImpl aufrufen, dann wird der Parameter initialisiert, denn ich habe es überprüft, indem ich den Wert in 'getConnectionParameter()' angezeigt habe. 2. Parameter wird erst nach dem Client-RPC-Aufruf 3 initialisiert. 'Parameter' in 'Objektspeicher' ist privat. Trotzdem habe ich seinen Namen in Parameter1 geändert. – NewCodeLearner

+2

@NewCodeLearner, Sie sagen, 'ConnectionServiceImpl' wird zweimal aufgerufen, und die NPE tritt zum zweiten Mal auf. Es spielt also keine Rolle, ob 'parameter' zum ersten Mal initialisiert wird - Sie erstellen ein zweites Objekt zum zweiten Mal, und da' parameter' nicht statisch ist, wird jedes Objekt seinen eigenen 'Parameter' haben. Und da Sie sagen, 'ConnectionServiceImpl' hat keinen Konstruktor, gilt Punkt 2 immer noch. Wenn Sie jedoch einfach den Nullwert eines Feldes zurückgeben, kann dies nicht zur NPE führen - zeigen Sie uns den vollständigen Code in 'getConnectionParameter'? –

+0

@ PéterTörök Ich habe hinzugefügt, was ich habe in der 'getConnectionParameter'.Aber dieser Code ist nur zum Anzeigen der' MAP' Kann meine nächste Frage ist dumm, aber ich möchte wissen, wo ich einen neuen Parameter erstellen. – NewCodeLearner

0

sehen, dass Parameterwert eingestellt ist, bevor Sie anrufen getConnectionParameter();

rufen Sie setConnectionParameter();, wo Sie fühlen müssen, zu vermeiden NullPointerException.

0

Zum einen würde ich fragen, warum Sie ein Mitglied connectionParameter vom Typ haben ConnectionParameter und Mitglied parameter vom Typ Map<String, String>, wenn Sie nur getParameter() aufrufen können.

Zweitens werden Ihre Methoden auf eine verwirrende Weise benannt. Es ist Konvention für Setter, einen Parameter des Typs zu nehmen, den sie festlegen. Ihr getConnectionParameter() gibt connectionParameter überhaupt nicht zurück.

Schließlich, wenn Sie versuchen, im Konstruktor der Unterklasse parameter zuzuweisen, wurde es noch nicht initialisiert (es sei denn, Sie haben es im Konstruktor der Superklasse getan).

Versuchen Sie, darüber nachzudenken, was Sie hier tun möchten, sollte die Klasse ConnectionServiceImpl für die Initialisierung seiner eigenen Mitglieder verantwortlich sein.

+0

: ich möchte nur den Wert in 'ConnectionServiceImpl.parameter' in 'objectStore' Klasse verwenden. Der Wert des Parameters wird initialisiert, kaufen Sie die andere Klasse 'ConnectionParameter' – NewCodeLearner