//接受页面参数
int type = Integer.parseInt(request.getParameter("type"));
String title = request.getParameter("title");
String writer = request.getParameter("writer");
//调用方法 
ArticleService articleService = new ArticleService();
//在这个判断为空的地方很不明白
if(title == null && writer == null){
System.out.println("Servlet这边没问题");
List searchArticle = (List)articleService.getArticleByType(type);
request.setAttribute("searchArticle", searchArticle);
request.getRequestDispatcher("showArticle.jsp").forward(request, response);
}else{
System.out.println("Servlet这边有问题");
List searchArticle = (List)articleService.searchArticle(type, title, writer);
request.setAttribute("searchArticle", searchArticle);
request.getRequestDispatcher("showArticle.jsp").forward(request, response);
}
上面的代码是属于一个Servlet中的  他需要处理jsp页面 的2中不同请求  一种请求是需要3个参数的  另外一个请求是需要1个参数的 那么我就需要Servlet中对其中2个可能为空的变量进行判空  一开始我是使用的 "".equals(title)  进行判空的   结果失败  程序执行了 else 中的代码  在我改回title == null 之后  程序才正常  我就不明白了  既然请求页面传递过来根本就没有另外2个参数 那怎么进行equals判空的时候还是为 true 的呢  而使用 title == null 就成功了  我知道 equals是判断内容的   == 是判断地址的   还有一个 title == "" 又是判断怎么一种情况?   刚才写了System.out.println(title);  结果是 null  希望高手可以从 栈内存  堆内存的角度说明一下  谢谢了  我在线等回复

解决方案 »

  1.   

    这和栈内存  堆内存有个屁上的关系
    ==null判的是是否为null,equals("")判的是是否为空串
     title == "" 判是否为同一个空串String对象
      

  2.   

    "".equals(title)为了避免指针写成这样,tile为NULL,""肯定不等于NULL呀
      

  3.   


     if(title == null && writer == null){//这个地方还需要判断条件!比如:"".equals(title)}
      

  4.   

    如果你写成title.equals("")肯定会报空指针异常的
      

  5.   

    这个还和堆,栈有什么关系。
    如果请求的URL类似于: http://localhost:8080/project/login.jsp?first=1&second=2
    那么调用request.getParameter("first")以及request.getParameter("second")都可获得值
    如果请求的URL类似于: http://localhost:8080/project/login.jsp?first=1&second=
    那么调用request.getParameter("first")可以获得"1"以及request.getParameter("second")这得到空字符串""了
    如果请求的URL类似于: http://localhost:8080/project/login.jsp?first=1
    也就是你的那种情况,参数数量变化了。
    那么调用request.getParameter("first")可以获得"1"以及request.getParameter("second")这得到就是NULL了
      

  6.   

    写得不详细,前后矛盾、
    如果你原来是这样写的
    if("".equals(title) && writer == null){}else{
    ....就会执行else的代码。
    }
      

  7.   

    "".equals(title)判断获得的字符串是否为"",说明title是在内存中存在的一个参数 但是值为空
    title==null 判断title是否在内存中存在 如果为null 说明是不占内存
      

  8.   

    String title = request.getParameter("title");
     比如说这一句 虽然请求页面没有该参数 但是 request.getParameter("title"); 之后    System。out.println() 是null   为什么是null 而不能是 "" 呢?
      

  9.   

    因为你的title是空对象,没有得到title参数。
      

  10.   

    你system.out.println(request.getParameter("title"));看看结果
      

  11.   

    长话短说吧, 哎, 真心寒啊, 刚才我打了至少500字String str = request.getParameter("paramName");//判断空
    if(str == null || str.length() == 0){
        //先判断是否为null, 再判断是否为长度为0的空串
    }//判断不为空
    if(str != null && str.length() > 0){
        //与判断空的情况正反
    }//判断相等
    if("constanse".equals(str)){
        //肯定不会报空指针
    }
    搞清楚null和""的区别就好办了.
      

  12.   


    PS: 
    我的目标是 ----> ^_^
      

  13.   

    "".equals()和==null
    通俗点说:一个是站着茅坑不拉屎,一个是不占茅坑也不拉屎
      

  14.   

    title == null && writer == null
    if(title.equals(null) && writer.equals(null))换成红色字体的代码
      

  15.   

    到lang包下拿stringUtils类
    他有isempty方法
    直接可以用可以到原码里找他的实现
      

  16.   

    搞清楚“”、null、。equals三者之间的关系就ok了
      

  17.   

    if((title==null && write==null)||("".equals("title") && "".equals("writer"))){
    ...
    }行吗
      

  18.   

    title为例
    先判断为是否为null(空),在判断是否为空串最简单的方法
    if(title == null || "".equals(title))
      

  19.   

    null 和 空串的 问题
      

  20.   

    呵呵。。很火喲我以為是問 == 和equals的区别的。
    米想到。是问“”和null的寒
      

  21.   

    楼主搞不清楚"" 和 null 的区别
      

  22.   

    request.getParameter("title")返回的是空引用,因为url都会转成string那就是"null"了,而不是""
      

  23.   

    null和"",在内存中,前者是不存在的。而后者在内存中有相应的内存地址的。
    StringUtils中面有isEmpty,可以用,要自己写,也很简单。public boolean isEmpty(String str) {
     retrun str == null || str == "" ?true:false;
    }顺建议一下楼主,都整上Servlet了,连最基本的null和"",equals与“==都会不清”。基础很重要呀。
      

  24.   

    这个回复是我想要的,嘿嘿 但是url 是怎么来的?  以前只以为是网页地址顺便再加100分 难得那么火的帖子了  
      

  25.   


    确实很不好意思 发这个帖子问这个问题 也犹豫了 但是还是发了  打破砂锅问到底了   以前学习的时候就是很生硬的记下了什么 null  怎么情况下判断  null  equals的问题 对于采取这样一个判断的理由是什么?  还没有时间和能力去弄明白 现在在项目 就是想把以前该会而又很差的东西拿出来 弄清楚  被人嘲笑了也没关系了
      

  26.   

    很奇怪  怎么我没有没在API文档中看到 StringUtils 这个类呢? 确定是在java.lang 下面么?
      

  27.   

      为了安全起见,你还是每次用的时候把 == null 和 .equals()都用上吧,这样也是最安全的!
      

  28.   

    今天刚刚想出来的原因 写出来 诸位仁兄看看理解有错误么?String title = request.getParameter("title"); request.getParameter("title"); 返回的是一个String 类型 但是因为不存在title 这个参数  它又不可能返回一个 “”  只可能返回一个 null
    那么这个时候 在栈内存中 我们只声明了一个引用变量  title  由于title参数不存在 所以在堆内存中也就不存在一个对象  也就更不可能存在一个内存地址被栈内存中的所指向   栈内存中的title 只有一个 null   所以在进行比较的时候   title == null  比较的是地址 也就是比较title中存储的 对内存中的地址  此时 null 正是 栈内存中title 引用变量所存储的 
      

  29.   

    说实在的那些堆啊栈的我真看不懂
    request.getParameter("title"); 没有这个参数自然是返回null的,若返回""的话那说明找到了参数,只不过参数值是""而已。
    要知道""是空字符串,他也是个String对象,也是值。
      

  30.   

           //接受页面参数
             int type = Integer.parseInt(request.getParameter("type"));
            String title = request.getParameter("title");
            String writer = request.getParameter("writer");
            //调用方法 
            ArticleService articleService = new ArticleService();
            //在这个判断为空的地方很不明白,在这里判断是否为“”或者null,如果是null,证明你的request.getParameter没有取到属性值
            if(("".equals(title)||title==null)&&(("".equals(writer)||writer==null)){
                System.out.println("Servlet这边没问题");
                List searchArticle = (List)articleService.getArticleByType(type);
                request.setAttribute("searchArticle", searchArticle);
                request.getRequestDispatcher("showArticle.jsp").forward(request, response);
            }else{
                System.out.println("Servlet这边有问题");
                List searchArticle = (List)articleService.searchArticle(type, title, writer);
                request.setAttribute("searchArticle", searchArticle);        
                request.getRequestDispatcher("showArticle.jsp").forward(request, response);
            }