如何使用扩展访问值超类

时间:2012-04-03 08:53:33

标签: java extends

我对延伸感到困惑,我跟理论一起解决了一些例子, 但是,当我来到我的主项目时,我仍然做错了什么,我无法找到它。

任何人都可以帮助我。

ConnectionServiceImpl

调用

RPC

当客户端调用COnnectionServiceImpl时,设置了connectionParameter。我通过显示在

中检查它
Map<String, String>

但是当客户端对ObjectStore进行第二次rpc调用时 它为NullPointerException

中设置的parameter提供错误super
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)

3 个答案:

答案 0 :(得分:2)

您似乎在初始化顺序和成员字段的ownerhsip方面存在问题。

  1. 您是否在其构造函数中初始化了ConnectionServiceImpl.parameter?你没有在那里显示任何构造函数 - 你有吗?如果没有,则在构造对象后,parameter未初始化。这意味着在getConnectionParameter之前调用connection会给你一个空指针。 (虽然它不应该导致NPE - 您告诉我们的代码是否正如您声称的那样生产NPE?)。

  2. 从上面可以看出,从getConnectionParameter的构造函数调用ObjectStore是一个错误,除非您之前(在父类构造函数中)初始化了ConnectionServiceImpl.parameter

  3. 显然,您在parameter中有一个名为ObjectStore的字段(重复ConnectionServiceImpl.parameter,因此非常气馁)或ConnectionServiceImpl.parameter - 其声明不是在你的代码中显示 - 不是private,因此可以从子类访问,并且你试图从子类构造函数初始化它(这通常是错误的 - 基类应该正确地初始化它的字段)。如果是这种情况,你实际上正在尝试“循环初始化”:初始化子类中的字段,并通过超类getter获取自己的值,这是愚蠢的。

答案 1 :(得分:0)

在调用getConnectionParameter();

之前,请参阅参数值

调用setConnectionParameter();,您需要避免 NullPointerException

答案 2 :(得分:0)

首先,当您可以致电connectionParameter时,我会问为什么您有ConnectionParameter类型的成员parameter以及Map<String, String>类型的成员getParameter()

其次,您的方法以令人困惑的方式命名。 setter的惯例是采用他们正在设置的类型的参数。您的getConnectionParameter()根本不会返回connectionParameter

最后,当您尝试在子类构造函数中分配parameter时,它尚未初始化(除非您已在超类构造函数中完成)。

尝试考虑你想在这里做什么,班级ConnectionServiceImpl应该负责初始化自己的成员。