今天写了个注册系统,其中一段代码如下:
String _username = request.getParameter("username");
String _password1 = request.getParameter("password1");
String _password2 = request.getParameter("password2");
String _email = request.getParameter("email");
if(_email == "")
_email = "no email";
if(
(_username == (""))||
(_password1 == (""))||
(_password2 == (""))||
(!_password1 == (_password2)) ){
response.sendRedirect(response.encodeURL("register.jsp"));
}
else{
......
}
结果怎么调试都跳到“response.sendRedirect(response.encodeURL("register.jsp"));”完全不执行else
调试了半天突然想起来String类中==和equals的区别:
"==" 比较的是两个对象的引用 (references),并不是他们的内容,所以即使他们内容相同只要引用不同依然返回false.
equals(Object) 方法为 Object 类中定义的方法,所用按照默认方式定义过 的类均是其子类。 也就是说 Object 类为所有类的超类 (super class,也叫父类、基类等),在Object 中 的 equals(Object) 方法其标准形式为
public boolean equals(Object obj)
返回类型为 boolean ,即 true/false 与 "==" 返回类型一样。Object 类中定义的 equals(Object) 方 法是直接使用 "==" 比较的两个对象,所以在没有覆盖 (override,或称改写、重写) equals(Object) 方法的情况 下,equals(Object) 与 "==" 一样是比较的引用。
但是String类的equals(Object) 方法(来自java.lang.String)覆盖了从 Object 继承来的的 equals(Object) 方法,用以比较字符串内容是否相同。
所以把代码改成:(其实只用改黑字)
......
if(
(_username.equals(""))||
(_password1.equals(""))||
(_password2.equals(""))||
(!_password1.equals(_password2)) ){
response.sendRedirect(response.encodeURL("register.jsp"));
}
......
就OK了!