当我运行它在containsKey()中阻止的项目时,我正在为一个使用struts2的大学类实现一个web项目。 它不会打印任何字符串。
这是我遇到问题的一些代码:
package fundstarter.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.SessionAware;
import java.rmi.RemoteException;
import java.util.Map;
import fundstarter.model.ConnectToRMIBean;
public class LogInAction extends ActionSupport implements SessionAware {
private static final long serialVersionUID = 4L;
private Map<String, Object> session;
private String username = null;
private String password = null;
@Override
public String execute() throws RemoteException {
this.getConnectToRMIBean().setUsername(this.username);
this.getConnectToRMIBean().setPassword(this.password);
this.getConnectToRMIBean().logIn();
return "done";
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public ConnectToRMIBean getConnectToRMIBean() {
if(!session.containsKey("RMIBean")){
System.out.println("hello little trouble maker");
this.setConnectToRMIBean(new ConnectToRMIBean());
}
System.out.println("Hey snowball");
return (ConnectToRMIBean) session.get("RMIBean");
}
public void setConnectToRMIBean(ConnectToRMIBean RMIBean) {
System.out.println("I'm positive he's dead");
this.session.put("RMIBean", RMIBean);
}
@Override
public void setSession(Map<String, Object> arg0) {
// TODO Auto-generated method stub
}
}
我的代码与我教授编写的代码完全一样,我无法弄清楚我的代码有什么问题?
答案 0 :(得分:1)
你应该得到NullPointerException
,因为你从未做过
this.session = /*...some object here...*/;
...在任何地方,因此session
具有默认值(null
)。因此,您第一次拨打getConnectToRMIBean
时会尝试拨打session.containsKey
并失败,因为您无法通过null
引用调用实例方法。
由于您正在使用SessionAware
,Struts会为您拨打setSession
,但您需要填写它,例如
@Override
public void setSession(Map<String, Object> theSession) {
this.session = theSession;
}
添加构造函数并将初始化放在构造函数中,或者只是将其作为初始化程序添加到声明行的末尾(就像您正在进行其他初始化一样) :
private Map<String, Object> session = new Map<String, ConnectToRMIBean>();