这个问题困恼我很久了 实在是不可理解String str;
if(str.equals(null))
  System.out.println("XXXXXXX");
就这样的代码str值如果传入不为null时  能打印XXXXX信息,可是如果str = null 时,
if(str.equals(null)) 这行运行就会报错   
我记得以前用equals一直都没出现过这样的问题   难道是我记错了,我以前从来没用过这样的方法???
不可能啊  
我也知道如果str为null时其实相当与null.equals(null)   这样是会报错
可是如果if(str.equals(null))  在str = null 时 也报错  那不意味着equals无法使用了??忘大牛们给我解惑  或许  真的是我哪里糊涂了  

解决方案 »

  1.   

    应该是if(str==""){
      System.out.println("***");
    }
      

  2.   

    if(str==null){
    这样也行把! 我被你一搞也混了!
      

  3.   

    public boolean equals(Object anObject)比较此字符串与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的字符序列的 String 对象时,结果才为 true。 
    这是刚从API中查到的!!!
      

  4.   

    ------->我也知道如果str为null时其实相当与null.equals(null)  这样是会报错 
    对呀,为什么会糊涂呀?
    如果str=null的时候,str为null,null是没有任何方法的,也就是说调用任何的方法肯定会抛出空异常的。
      

  5.   

    if(str == null)  这样是可以  我觉得我那样也应该可以啊
    想一下  不管是什么对象  只要用了equals,我也不看右边等于什么,  一旦左边那个对象为null  那么程序不就要报错了??
    那么这样的话equals这个方法还有人敢用么???
    我以前也是用equals判断  好像没出过这样的问题啊    很是纳闷啊
      

  6.   


    先判断一下 不就行了 吗 ?
    if(str == null)
    {
      return;
    }if(str.equals(null))
      System.out.println("XXXXXXX"); 
      

  7.   

    ==和equals是有区别的!==用于比较两个变量本身的值,即在内存中的首地址;equals是比较两个字符串中包含的内容是否相等。对于非字符串变量,两个方法都是比较两个变量的首地址是否相同。str = null 时,内存地址都没分配,它比较啥呢??
    PS:我感觉5楼说得挺对的。我是新手,请各位高手指正!!
      

  8.   

    用null的时候是用==比较  str==null
    用equals的时候是""比较  str.equals("")
    明白了吧
      

  9.   

    你们都仔细看我说的情况啊  我知道null.equals("xxxx") 这样会出错  就如5楼说的但问题也就出在这里啊   我要问的并不是但指String 其他对象都是啊
    说白了只要用到equal的,左边存在对象值不确定情况下难道都要先
    if(XXX == null) 再使用if(XXX.equals(XXXX)) 么???
      

  10.   

    String str;  //注意,没有赋值
    if(str.equals(null)) 
      System.out.println("XXXXXXX"); 开始没有赋值,实际为null,null没有equals方法,应该抛出nullpointexception;如果初始化值,"abc".equals(null)ok不过这里也有个逻辑问题,SDK如是说:
    public boolean String.equals(Object anObject),这里null可以传入,是不是说null也算Object呢.....然而class.forname("null")木有,null.xxx也木有。
    不知如何园法。
      

  11.   

    就不说比较null值了  就两个对象互相比较
    if(ObjectA.equals(ObjectB))一旦ObjectA为null  就会报异常了   
    如果真要用:
    if(ObjectA !null)
       if(ObjectA.equals(ObjectB))
    这样的话,那这样不是很麻烦  那为什么equals方法不从新改写下再去使用的好
      

  12.   


    楼主肯定忘记了,以前你是这样写代码的:
    if(str==null || str.equals(null)) 
      System.out.println("XXXXXXX"); 
      

  13.   

    12楼的   str没赋值那不是重点  我只是为了说明才写出来的   还是强调一点 
      我不是问为什么null。equals(xxx)会报错这个问题哦
      

  14.   


    呵呵  我以前应该是这样写的:
    if(XXX.euqals(null) || XXX.equals(""))
    之所以以前没遇见报错的情况那是因为XXX不是null,现在真好被我遇见了  我才考虑到了这个问题
      

  15.   

    很明显的问题啊,str都已经为null了,楼主你认为一个null值会有euqals方法吗?
      

  16.   

    大哥,你既然知道null.equals(null)这样会报错,那么你用str.equals(null)当你的str=null的时候不就相当于null.equals(null)吗??这样肯定会报错啊,这有什么搞不清楚的啊,真是服了
      

  17.   

    null,内存中是空的,什么属性和方法都没有,那来的null.equals(obj)
      

  18.   

    null本身不是对象,也不是Objcet的实例null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。可以做一个简单的例子:       //null是对象吗? 属于Object类型吗?       Java code    if (null instanceof java.lang.Object) { System.out.println("null 属于java.lang.Object类型"); } else { System.out.println("null不属于 java.lang.Object类型"); }
    结果会输出:null不属于java.lang.Object类型 参考资料:http://tieba.baidu.com/f?kz=510289524 
      

  19.   

    null不是字符类型,但是equals("")这里面只能放入一个字符类型。你可以这样
    if(str==null||str.equals(""))
        System.out.println("XXXXXXX"); 
      

  20.   

    if(str==null||str.equals(""))
        System.out.println("XXXXXXX"); 一般是这么写的。楼主觉得恶心可以自己封装一个工具类。
    ps. 这个确实有点e
      

  21.   

    if(str!=null && str.equals("xxxx")) 
      System.out.println("XXXXXXX"); 
      

  22.   

    面向对象的东西str 都是null, 还谈什么equals方法
      

  23.   


    if(str==null) 与 if(str=="")
    str==null  str=="" // 是两个不一样的吧
    一个是null空值,一个是空字符串
    学习学习
      

  24.   

    ********************************
    ==比较的是地址
    equals比较的是值
      

  25.   

    让大家看看真正的做法:
       /**
        * 判断String对象不是空
        * @param s 需要判断的字符串对象
        * @return 如果不是空就返回true,否则返回false
        */
       public static boolean isNotEmpty(String s){ 
    return s!=null&&s.length()>0;
       }这才是比较好的写法。到java7的时候就用?直接比较了。
      

  26.   

      看看你的付值了没如果付值了就不能为空.
      先定义一个类型  String str
    然后再
        String str; 
       if(str.equals(null)) 
           System.out.println("XXXXXXX"); 开始没有赋值,实际为null,null没有equals方法,应该抛出nullpointexception;如果初始化值,"abc".equals(null)ok 不过这里也有个逻辑问题,SDK如是说: 
    public boolean String.equals(Object anObject),这里null可以传入,是不是说null也算Object呢.....然而class.forname("null")没有,null.xxx也没有。    如果str为null时其实相当与null.equals(null)  这样是会报错  
       如果str=null的时候,str为null,null是没有任何方法的,也就是说调用任何的方法肯定会抛出空异常的
      

  27.   

     String str; 
      if(str.equals(null)) 
          System.out.println("XXXXXXX"); 
    这样应该没办法通过编译呀。
      

  28.   

    运行了下,这个事运行部了的。
    public static void main(String[] args){
    String str ="null"; 
      if(str.equals("null")) 
          System.out.println("XXXXXXX"); 
      } 
    以上才是能运行的代码。原因是由于equals这个方法后面应该加一个object(也就是对象),你和null比较是不行的,因为null是没有对象,这就相当于你把str.equals(null)当做str.equals(),而str.equals()是没有这个方法的,会返回nullpointerexception异常  
      

  29.   

    那还不如用StringUtils,java自带的类,强悍得很。StringUtils.isBlank(str);还有很多的方法,比较两个字符串是否相等也有,好处就是传进去的参数是空的也不会抛空值异常
      

  30.   

    String str; 
    if(str.equals(null)) 
      System.out.println("XXXXXXX"); String str; 在程序中如果没有指定值的话,那要写在方法体外面,因为只有方法体外面的成员变量没有赋值的时候会给个初始值,jvm给String值的时候是null,并没有创建String对象,也就是没有实例化对象,
    这样怎么能使用没有实例化对象的方法呢!结果肯定是出现npe异常
      

  31.   

    我靠,判断是否为null不要用equals
      

  32.   

    #14 楼  的说的很对  有问题 差API呀~!
      

  33.   

    string str = null;
    if(null == str && "".equals(str)){
       又不考认证 这样判断 就OL  , 管你传什么值
    }
      

  34.   

    可是如果if(str.equals(null))  在str = null 时 也报错  那不意味着equals无法使用了?? 
    楼主是这样说的,这个没错,如果str = null 时equals是绝对无法使用的。
    可以用StringUtils.equals(str1, str2);这样即使两个都是Null也能判断
      

  35.   

    equals是一个方法,无论用什么方法前都要保证对象不为空才能用,这一点是永远不会变的。做动作总要有个主题吧?跟英语里面的主语谓语道理一样。
    ==,||,&&是运算符,不是方法,只是一个判断的运算,而没有发起的主体,所以null==null是可以的。
    我估计你是把方法和运算符搞混了吧
      

  36.   

    放段JDK5.0的String的源代码:
     /**
         * Compares this string to the specified object.
         * The result is <code>true</code> if and only if the argument is not
         * <code>null</code> and is a <code>String</code> object that represents
         * the same sequence of characters as this object.
         *
         * @param   anObject   the object to compare this <code>String</code>
         *                     against.
         * @return  <code>true</code> if the <code>String </code>are equal;
         *          <code>false</code> otherwise.
         * @see     java.lang.String#compareTo(java.lang.String)
         * @see     java.lang.String#equalsIgnoreCase(java.lang.String)
         */
        public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }
      

  37.   

    但凡有一点开发经验,而且能够做主的程序员,写程序的时候,都应该加入commons-lang
      

  38.   

      ==  和 equals  之间的区别啊
      

  39.   

    equals 是String 对象的方法,null不是String对象,调用null.equals(xx)当然会报错,
    所以在调用equals方法的时候一般使用:"xxxx".equals(str),或者 str != null && str.equals("xxx") 用来避免null的问题
      

  40.   

    哎  很大部分回答的都是理解错了我意思了  
    还有 我写
    String str; 
    if(str.equals(null)) 
      System.out.println("XXXXXXX"); 这样的并不表示代码说str没赋值,我这样写只是为了说明我要说的问题啊    
    好像就33 和34楼的理解了我要说的了  我并不是要讨论equals跟 = 的区别  我也不是要讨论null的的用法   我讨论的是:
    但凡一个未知的对象使用equals方法,那么必须要先判断是否为空否则直接使用equals是不安全的行为
    当然if(Object !=null || Object.equals(null)) 这样的方法能解决,但不觉得这样使用equals很别扭么,也就是说对象判断是否相等绝对不能单独使用equals必须先判断是否为空了
    48楼的这个方法StringUtils.equals(str1, str2);没用过 ,  呵呵,我去试试  
      

  41.   

    我也知道如果str为null时其实相当与null.equals(null)  这样是会报错 
    可是如果if(str.equals(null))  在str = null 时 也报错  那不意味着equals无法使用了??str = nulll,就是为str赋予了一个空引用,再调用它的方法,编译时可以通过,运行时就通不过了,当然报错
      

  42.   


    所以java7为了这个问题,为了程序员少写点null判断,引入了问号直接比较。
      

  43.   

    这个我做了,可以是 if(str.length()==0) 这样就行了啊然后打印
      

  44.   

    大家基本上都说了,我问两个问题:(1)String str=null; 你认为在堆中有没有创建一个String对象呢?    答案是没有,这时只在栈中有一个str引用,这个引用指向了null对象而已。(2) 那么好,null对象有equals()方法吗?    这是显然的,所以当String str=null时,在str.equals()试问JVM到那里去找你的equlas方法那,只能给你一NullPointerException。
      

  45.   

    27#有正解
    if (null == str || "".equals(str))
    {
        System.out.println("");
    }
      

  46.   

    if (str==null || str.length==0)

        System.out.println(""); 
    }
      

  47.   

    equals()方法如果没重写的话,就是Object超类的方法
    建议你去查一下API看看Object的方法
      

  48.   

    equals
    public boolean equals(Object anObject)将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。 覆盖:
    类 Object 中的 equals
    参数:
    anObject - 与此 String 进行比较的对象。 
    返回:
    如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
    另请参见:
    compareTo(String), equalsIgnoreCase(String)
      

  49.   

    这里,equals()是String对象的方法,如果str为null,它就没有引用任何对象,何来的equals()方法?
      

  50.   

    lz给出的代码可以在IDE里编译通过吗?
    java不允许局部变量没有赋值就直接使用。
    何来lz的问题。。
    搞不懂lz是因为什么困惑?
    这帖子也要发出来。
    浪费资源!!!
      

  51.   

    大哥,我说你看清楚了我要问什么么 ,晕死,想必你是只看了我代码下面的还没看你就评论的吧
    我那样写只是为了说明一下问题,哎,跟你们这些不仔细看就评论的说不清楚 ....回61楼:java7有解决这个问题啊   不过你说的引用问号直接比较不明白  有时间去看看  
      

  52.   

    xxx.equals(yyy)
    其中yyy可为null
    xxx不为null
      

  53.   

    String str; 
    if(str.equals(null)) 
      System.out.println("XXXXXXX"); 一般都不这么用 
    应该这样
    if(str.equals("")){}
    if(str==null){}学习不要专牛角尖
      

  54.   

    最好是 if("".equals(str)){} 
      

  55.   

    lz看过Java核心技术吗 里面有一页就是讲这个问题 我就不解释了
      

  56.   

    晕死  有人竟然说成钻牛角尖了汗 直到现在我还一直使用if(OjbectA !=null && ObjectA.equals(ObjectB))来判断两个对象是否相等,我只是想知道有什么方法能避免来判断是否等于null而直接判断两个对象相等问题 
    不知道你们平时发表评论都是怎么发表的,只看一部分,然后就自以为要问什么问题了,最后出现的就是断章取义.....
       很感谢33、61、48楼的大哥们  你们才清楚小弟要问题的问题是什么谢谢 48楼的大哥,StringUtils.equals(XXX,XXX)确实能解决null的问题,这样就可以避免去判断是否为null了帖子在挂1天,期望更多牛人们回答  明天结贴。
      

  57.   

    if(null.equals(str)) 
      System.out.println("XXXXXXX"); 
    这样就可以了