Как использовать расширяет доступ к значению суперкласса

Я перепутал с расширением, я пошел с теорией и решил некоторые примеры, но когда я прихожу в свой основной проект, я все еще делаю что-то не так и не могу его найти.

Может кто-нибудь мне помочь.

ConnectionServiceImpl называется RPC

Когда клиент вызывает COnnectionServiceImpl, устанавливается connectionParameter. Я проверил это путем отображения в

Map<String, String>

но когда второй вызов RPC сделан к ObjectStore клиентом его дай мне ошибку 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 ответа

Решение

Похоже, у вас проблема с порядком инициализации и владельцем полей членов.

  1. Вы инициализировали ConnectionServiceImpl.parameter в своем конструкторе? Вы не показываете конструктор там - у вас есть? Если нет, то сразу после построения объекта, parameter неинициализирован. Что означает, что вызов getConnectionParameter до connection дает вам нулевой указатель. (Хотя это не должно привести к NPE - действительно ли код, который вы показываете нам, действительно производит NPE, как вы утверждаете?).

  2. Из вышесказанного следует, что ваш призыв к getConnectionParameter от конструктора ObjectStore это ошибка, если вы не инициализировали ConnectionServiceImpl.parameter до (в конструкторе родительского класса).

  3. Видимо у вас либо есть поле с именем parameter в ObjectStore (который дублирует ConnectionServiceImpl.parameterтаким образом крайне не рекомендуется), или ConnectionServiceImpl.parameter - чья декларация не отображается в вашем коде - нет private, таким образом, доступный из подкласса, и вы пытаетесь инициализировать его из конструктора подкласса (что в целом неверно - базовый класс должен позаботиться о правильной инициализации его полей). И если это так, то вы на самом деле пытаетесь "циклически инициализировать": инициализировать поле в подклассе с его собственным значением, полученным через метод получения суперкласса, что глупо.

Убедитесь, что значение параметра установлено перед вызовом getConnectionParameter();

вызов setConnectionParameter(); где вы чувствуете необходимость избежать NullPointerException.

Во-первых, я бы спросил, почему у вас есть член connectionParameter типа ConnectionParameter И член parameter типа Map<String, String> когда ты можешь просто позвонить getParameter(),

Во-вторых, ваши методы названы в замешательстве. Для сеттеров принято принимать параметр типа, который они устанавливают. Ваш getConnectionParameter() не возвращается connectionParameter совсем.

Наконец, когда вы пытаетесь назначить parameter в конструкторе подкласса он еще не был инициализирован (если вы не сделали это в конструкторе суперкласса).

Попробуйте подумать о том, что вы хотите сделать здесь, класс ConnectionServiceImpl должен нести ответственность за инициализацию своих собственных членов.

Другие вопросы по тегам