今天在写代码中遇到一个空指针异常
用户存在激活码状态也是Y,就把标志设为true if(loginuser.getStatus().equals("Y") && loginuser!=null){ //登录成功 info.setFlag(true); } if (!loginuser.getStatus().equals("Y") && loginuser!=null){ info.setFlag(false); info.setErrorMsg("您尚未激活,请激活"); }
这样写报错
java.lang.NullPointerException at cn.itcast.travel.web.servlet.loginservlet.doPost(loginservlet.java:35) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.Ht
改成
//5.判断用户是否激活 if(loginuser != null && !"Y".equals(loginuser.getStatus())){ //用户尚未激活 info.setFlag(false); info.setErrorMsg("您尚未激活,请激活"); } //6.判断登录成功 if(loginuser != null && "Y".equals(loginuser.getStatus())){ req.getSession().setAttribute("user",loginuser);//登录成功标记 //登录成功 info.setFlag(true); }
正常运行
百度后发现
看equals方法的源码就清楚了
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
这里用 if (anObject instanceof String) 来判断传入的对象是否是String类型,如果不是直接返回false。
因此在使用equals方法上,如果一个数值可能为空的对象实例,调用equals方法时,一定要遵循 “常量”.equals(变量) 或者 后输入的.equals(之前的)。这样就可以尽量避免空指针错误。