代码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包及帮助
分享到:
相关推荐
解决方法:异步操作的问题。云函数主体代码运行到最尾时就会结束线程,不会等你异步的返回结果。 // 云函数的index.js文件中 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() ...
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/...
20.ejb的分类及区别 21.你对现在软件业以及国内软件业的看法 22.谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27.对于java流的...
和 1.7 大体上都差不多,还是有几个重要的区别: TREEIFY_THRESHOLD 用于判断是否需要将链表转换为红黑树的阈值。 HashEntry 修改为 Node。 Node 的核心组成其实也是和 1.7 中的 HashEntry 一样,存放的都是 key ...
此外,文档介绍了哈希冲突的概念和解决方法,以及HashMap的查询流程和与Hashtable的区别。特别强调了Hashtable不允许插入null的原因,以及ConcurrentHashMap在线程安全实现和锁优化方面的策略。 总的来说,这份文档...
此外,文件介绍了哈希冲突的概念和解决方法,以及HashMap的查询流程和与Hashtable的区别。特别强调了Hashtable不允许插入null的原因,以及ConcurrentHashMap在线程安全实现和锁优化方面的策略。 总的来说,这份文件...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...
199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...
Oracle 一个表字段,更新另一个表字段 报 not null PowerDesigner去除引号方法 显示公式和编辑公式的区别 Exception occurred executing command line解决方案 powerdesigner设计数据库表的.pdm文件时出现几大问题 ...
基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。 1.用法如下: toString()方法:返回对象的字符串表示。 对象 操作 Array 将 Array 的元素...
1. 描述 在MySQL中,当我们需要获取某张表中的总行...为了解决上述的问题,我创建了一张 user 表,它有两个字段:主键id和name,后者可以为null,建表语句如下。 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_I
39、oracle数据库表的备份及还原 54 40、谈谈你知道的数据库和中间件 54 41、oracle和MySQL的区别 54 42、简述Mysql的InnoDb 55 43、删除重复数据只保留一条。 55 44、一个几千万数据,发现数据查询很慢,怎么办? ...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
解决方法: 1、 卸载软件。要确定原来的文件完全卸载,检查一下提示框显示的那个路径下还有没有文件,有就说明没卸完全。手动删掉它。 2、 重新安装这个软件。 3、 或者换个位置重装安装。 22、错误800700c1 未知...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
3、对列起别名:有直接起别名,加AS起别名,用双引号起别名等三种方法 (单引号,引起字符串;双引号,引起别名。起别名有符号,或者区分大小写时,必须用双引号) 多表查询时,可给表起别名。(给列起别名,列<空格...