Как использовать расширяет доступ к значению суперкласса
Я перепутал с расширением, я пошел с теорией и решил некоторые примеры, но когда я прихожу в свой основной проект, я все еще делаю что-то не так и не могу его найти.
Может кто-нибудь мне помочь.
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 ответа
Похоже, у вас проблема с порядком инициализации и владельцем полей членов.
Вы инициализировали
ConnectionServiceImpl.parameter
в своем конструкторе? Вы не показываете конструктор там - у вас есть? Если нет, то сразу после построения объекта,parameter
неинициализирован. Что означает, что вызовgetConnectionParameter
доconnection
дает вам нулевой указатель. (Хотя это не должно привести к NPE - действительно ли код, который вы показываете нам, действительно производит NPE, как вы утверждаете?).Из вышесказанного следует, что ваш призыв к
getConnectionParameter
от конструктораObjectStore
это ошибка, если вы не инициализировалиConnectionServiceImpl.parameter
до (в конструкторе родительского класса).Видимо у вас либо есть поле с именем
parameter
вObjectStore
(который дублируетConnectionServiceImpl.parameter
таким образом крайне не рекомендуется), илиConnectionServiceImpl.parameter
- чья декларация не отображается в вашем коде - нетprivate
, таким образом, доступный из подкласса, и вы пытаетесь инициализировать его из конструктора подкласса (что в целом неверно - базовый класс должен позаботиться о правильной инициализации его полей). И если это так, то вы на самом деле пытаетесь "циклически инициализировать": инициализировать поле в подклассе с его собственным значением, полученным через метод получения суперкласса, что глупо.
Убедитесь, что значение параметра установлено перед вызовом getConnectionParameter();
вызов setConnectionParameter();
где вы чувствуете необходимость избежать NullPointerException.
Во-первых, я бы спросил, почему у вас есть член connectionParameter
типа ConnectionParameter
И член parameter
типа Map<String, String>
когда ты можешь просто позвонить getParameter()
,
Во-вторых, ваши методы названы в замешательстве. Для сеттеров принято принимать параметр типа, который они устанавливают. Ваш getConnectionParameter()
не возвращается connectionParameter
совсем.
Наконец, когда вы пытаетесь назначить parameter
в конструкторе подкласса он еще не был инициализирован (если вы не сделали это в конструкторе суперкласса).
Попробуйте подумать о том, что вы хотите сделать здесь, класс ConnectionServiceImpl
должен нести ответственность за инициализацию своих собственных членов.