`

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包及帮助
分享到:
评论

相关推荐

    【小程序云开发】本地调试和云端测试的结果不一致,返回值result为null

    解决方法:异步操作的问题。云函数主体代码运行到最尾时就会结束线程,不会等你异步的返回结果。 // 云函数的index.js文件中 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() ...

    TCP/IP详解

    22.8 解决拨号网络连接中的问题 242 22.8.1 确认DUN配置 242 22.8.2 PPP日志 243 22.9 小结 243 第23章 Windows NT 4.0 244 23.1 Windows NT版本 244 23.2 体系结构 244 23.3 安装Windows NT 4.0 244 23.4 配置TCP/...

    JAVA面试题最全集

    20.ejb的分类及区别 21.你对现在软件业以及国内软件业的看法 22.谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27.对于java流的...

    sesvc.exe 阿萨德

    和 1.7 大体上都差不多,还是有几个重要的区别: TREEIFY_THRESHOLD 用于判断是否需要将链表转换为红黑树的阈值。 HashEntry 修改为 Node。 Node 的核心组成其实也是和 1.7 中的 HashEntry 一样,存放的都是 key ...

    Java面试题-并发.docx

    此外,文档介绍了哈希冲突的概念和解决方法,以及HashMap的查询流程和与Hashtable的区别。特别强调了Hashtable不允许插入null的原因,以及ConcurrentHashMap在线程安全实现和锁优化方面的策略。 总的来说,这份文档...

    Java面试题-哈希.docx

    此外,文件介绍了哈希冲突的概念和解决方法,以及HashMap的查询流程和与Hashtable的区别。特别强调了Hashtable不允许插入null的原因,以及ConcurrentHashMap在线程安全实现和锁优化方面的策略。 总的来说,这份文件...

    关于JAVA面试的100题及其答案

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    java 面试题 总结

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    超级有影响力霸气的Java面试题大全文档

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    千方百计笔试题大全

    199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...

    java面试宝典

    199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...

    NC(UFIDA)开发错误整理

    Oracle 一个表字段,更新另一个表字段 报 not null PowerDesigner去除引号方法 显示公式和编辑公式的区别 Exception occurred executing command line解决方案 powerdesigner设计数据库表的.pdm文件时出现几大问题 ...

    javascript中tostring()和valueof()的用法及两者的区别

    基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。 1.用法如下: toString()方法:返回对象的字符串表示。 对象 操作 Array 将 Array 的元素...

    详解 MySQL中count函数的正确使用方法

    1. 描述 在MySQL中,当我们需要获取某张表中的总行...为了解决上述的问题,我创建了一张 user 表,它有两个字段:主键id和name,后者可以为null,建表语句如下。 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_I

    Java面试宝典2020修订版V1.0.1.doc

    39、oracle数据库表的备份及还原 54 40、谈谈你知道的数据库和中间件 54 41、oracle和MySQL的区别 54 42、简述Mysql的InnoDb 55 43、删除重复数据只保留一条。 55 44、一个几千万数据,发现数据查询很慢,怎么办? ...

    java面试笔试题大汇总

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

    C语言上机问题解答

    解决方法: 1、 卸载软件。要确定原来的文件完全卸载,检查一下提示框显示的那个路径下还有没有文件,有就说明没卸完全。手动删掉它。 2、 重新安装这个软件。 3、 或者换个位置重装安装。 22、错误800700c1 未知...

    java面试题

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    2009达内SQL学习笔记

    3、对列起别名:有直接起别名,加AS起别名,用双引号起别名等三种方法 (单引号,引起字符串;双引号,引起别名。起别名有符号,或者区分大小写时,必须用双引号) 多表查询时,可给表起别名。(给列起别名,列<空格...

Global site tag (gtag.js) - Google Analytics