2012-04-03 7 views
0

私は拡張と混同していますが、理論に沿っていくつかの例を解決しました。 しかし、私のメインプロジェクトにはまだ間違ったことをしています。 。スーパークラスの値にアクセスする方法を拡張する

誰でも私を助けることができます。それをチェックするクライアントは、ディスプレイによってconnectionParameterは.Iに設定されているCOnnectionServiceImplを呼び出すと

ConnectionServiceImplRPC

によって呼び出され

Map<String, String> 

が、第2 RPCコールは、クライアントによってObjectStoreに行われたとき エラーNullPointerExceptionparametersuperクラス

に設定されました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(); 
} 
} 

このクラスはうまくいきます。

今、

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

誰もがこれを説明することができますか

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); 
    } 

} 

間違いを教えてスタックトレース

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

スタックトレースも追加plsと可能なコードの詳細 – fmucar

+0

親クラスのコンストラクタはどのように見えますか?親クラスのデフォルトのコンストラクタが接続パラメータを初期化することになっていれば、問題は解消されます。 – Scorpion

+0

@Scorpion:コンストラクタはありません。 – NewCodeLearner

答えて

2

メンバフィールドの初期化順序とownerhsipに問題があるようです。

  1. コンストラクタでConnectionServiceImpl.parameterを初期化しましたか?あなたはそこにコンストラクタを表示していません - あなたは何かを持っていますか?そうでなければ、オブジェクトを構築した直後にparameterは初期化されていません。つまり、getConnectionParameterconnectionの前に呼び出すと、nullポインタが返されます。 (NPEになるべきではありませんが、あなたが主張しているように私たちが実際にNPEを生産していることを示すコードです)。以上のことから

  2. は、あなたが(親クラスのコンストラクタで)前にConnectionServiceImpl.parameterを初期化していない限りObjectStoreのコンストラクタからgetConnectionParameterへのお電話は、誤りであるということになります。

  3. はどうやらあなたはObjectStoreparameterと呼ばれるフィールド(ConnectionServiceImpl.parameterを複製し、これ非常に落胆ある)、またはConnectionServiceImpl.parameter持っているのいずれか - その宣言あなたのコードに示されていないが - 、サブクラスからこれにアクセスprivateではない、とあなたサブクラスのコンストラクタから初期化しようとしています(これは一般的に間違っています - 基本クラスはそのフィールドを適切に初期化する必要があります)。この場合、実際には "循環初期化"を試みています。サブクラスのフィールドを、スーパークラスのゲッターを使って取得した独自の値で初期化しようとしています。それは愚かです。あなただけのgetParameter()を呼び出すことができたときにあなたがタイプConnectionParameterのメンバーconnectionParameter AND型Map<String, String>のメンバーparameterを持っている理由

+0

私はいくつかの詳細を追加しました。クライアントがConnectionServiceImplを呼び出したときに、パラメータが初期化されたため、 'getConnectionParameter()'に値を表示してチェックしました。 2.パラメータはクライアントのRPC呼び出しの後でのみ初期化されます。3. ObjectStoreの 'parameter'はprivateです。それでも名前をparameter1に変更しました。 – NewCodeLearner

+2

@NewCodeLearnerでは、 'ConnectionServiceImpl'が2回呼び出され、NPEは2回目に発生します。したがって、 'parameter'が最初に初期化されるかどうかは重要ではありません。つまり、2回目に別のオブジェクトを作成していて、' parameter'は静的ではないので、各オブジェクトは独自の 'parameter'を持ちます。そして 'ConnectionServiceImpl'にコンストラクタがないと言うので、私のポイント2はまだ適用されます。しかし、フィールドのヌル値を返すだけではNPEは発生しません - あなたは 'getConnectionParameter'で完全なコードを表示していますか? –

+0

@PéterTörök私は 'getConnectionParameter'に追加したものを追加しました。しかし、そのコードは' MAP'を表示するだけです 私の次の質問は愚かですが、私は新しいパラメータを作成しています。 – NewCodeLearner

0

あなたはgetConnectionParameter();

を呼び出す前に、パラメータ値が設定されていることを確認210

setConnectionParameter();あなたは避ける必要があると感じるところNullPointerException

0

まず私は疑問だろう。

第2に、メソッドの名前が混乱します。設定者が設定しているタイプのパラメータを取るのが慣習です。 getConnectionParameter()connectionParameterを返しません。

最後にparameterをサブクラスコンストラクタに割り当てようとすると、まだスーパークラスコンストラクタでそれを行っていない限り、まだ初期化されていません。

あなたがここで何をしたいか考えてみてください。クラスConnectionServiceImplは、自分のメンバーを初期化する責任があります。

+0

: 'ObjectStore'クラスの' ConnectionServiceImpl.parameter 'の値を使いたいだけです。パラメータの値は、他のクラス 'ConnectionParameter'を購入して初期化されます。 – NewCodeLearner

関連する問題