gpt4 book ai didi

java - 如何使用扩展来访问值父类(super class)

转载 作者:行者123 更新时间:2023-12-02 07:53:11 26 4
gpt4 key购买 nike

我对扩展感到困惑,我用理论解决了一些例子,但是当我来到我的主要项目时,我仍然做错了一些事情,而且我找不到它。

谁能帮帮我。

ConnectionServiceImplRPC调用

当客户端调用CONnectionServiceImpl时,连接参数被设置。我通过显示在

中检查了它
Map<String, String>

但是当客户端对 ObjectStore 进行第二次 rpc 调用时它给我错误 NullPointerException 对于在 super 类中设置的相同 parameter

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)

最佳答案

您似乎对成员字段的初始化顺序和所有者地址有问题。

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

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

  3. 显然,您在 ObjectStore 中有一个名为 parameter 的字段(它与 ConnectionServiceImpl.parameter 重复,因此强烈建议不要这样做),或 ConnectionServiceImpl.parameter - 其声明未在代码中显示 - 不是 private,因此可以从子类访问,并且您尝试从子类构造函数初始化它(这通常是错误的 - 基类应该负责正确初始化其字段)。如果是这种情况,您实际上是在尝试“循环初始化”:使用通过父类(super class) getter 获取的自己的值来初始化子类中的字段,这是愚蠢的。

关于java - 如何使用扩展来访问值父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9990022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com