null ""的区别及解决方法

代码review的时候居然发现犯这么低级的错误,判空方法严重错误

 

 

String strNull = null; str引用为空,对象还未创建 
String strEmpty = ""; str应用一个空串,栈空间中已经分配内存空间 
   
    
//先判断是不是对象,如果是,再判断是不是空字符串
if(strNull == null || strEmpty.equals(" ")){
    // do something
}


//我们这里是声明的strEmpty,如果我们不知道strEmpty是否已经声明呢
//所以,很有可能strEmpty没有创建,那么Nullpointer Exception就发生了
//因此,我们要用一个已知的变量去equals一个未知的变量
if(strNull == null || "".equals(strEmpty)){
    // do something
}

//但是更好的方法是我们用apache的第三方jar包
//apache commons 有一个StringUtils里面包含了判空方法,其源代码如下

public static boolean isEmpty(String str) {
     return str == null || str.length() == 0;
}


//isEmpty(String str) 我们同时注意到如果str为Null 同样有空指针错误

//好在ObjectUtil里面重写了toString方法,我们查看其源代码如下
public static String toString(Object obj) {
     return obj == null ? "" : obj.toString();
}

  
//所以,如果怕导致空指针异常我们只需要先调用toString方法
//然后调用isEmpty方法即可,例子如下
package com.test;
import org.apache.commons.lang.StringUtils;
/**
 *
 * @author kevin.yang
 */
public class StringUtilsTest {
    public static void main(String[] args){
        StringUtilsTest testNull = null;
        StringUtilsTest test = new StringUtilsTest();
        boolean isNull ;
        
        //对象不为空
      isNull = StringUtils.isEmpty(test.toString());
        System.out.println("对象不为空||test.toString():"+test.toString());

        //对象为空
     isNull = StringUtils.isEmpty(testNull.toString());
        System.out.println("对象为空||testNull.toString()"+testNull.toString());
    }
}
//我们可以看到控制台报空指针了
对象不为空||test.toString():com.test.StringUtilsTest@de6ced
Exception in thread "main" java.lang.NullPointerException
        at com.test.StringUtilsTest.main(StringUtilsTest.java:18)
Java Result: 1

//原因在与testNull 对象为空,其调用jdk的toString()方法必然报错
//一方面我们可以自己重写toString方法,我采用的是
//调用lang包下的ObjectUtils下的toString方法
package com.test;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.ObjectUtils;
/**
 *
 * @author kevin.yang
 */
public class StringUtilsTest {
    public static void main(String[] args){
        StringUtilsTest testNull = null;
        StringUtilsTest test = new StringUtilsTest();
        boolean isNull ;
        
        //对象不为空
        isNull = StringUtils.isEmpty(test.toString());
        System.out.println("对象不为空||test.toString():"+test.toString());

        //对象为空
        //isNull = StringUtils.isEmpty(testNull.toString());
        //System.out.println("对象为空||testNull.toString()"+testNull.toString());

        //调用ObjectUtils下的方法
        String obNull = ObjectUtils.toString(testNull);
        System.out.print("obNull:"+obNull);

        System.out.println("obNull--->isEmpty():"+StringUtils.isEmpty(obNull));
    }
}

//我们看看控制台的输出
对象不为空||test.toString():com.test.StringUtilsTest@de6ced
obNull:obNull--->isEmpty():true
    这样我们就解决了为空的问题
    commons包下还有很多很好用的工具,可以到网上下载他的jar包及帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值