Java containsKey()不起作用

时间:2015-12-06 18:37:07

标签: java dictionary web struts2

当我运行它在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

    }
}

我的代码与我教授编写的代码完全一样,我无法弄清楚我的代码有什么问题?

1 个答案:

答案 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>();