文章目录
- Map 的判空正确做法
- isEmpty
- Null == map
- Map 判空误区
- String 的判空
首先我先对 NPE(NullPointerException) 做出一个我自己理解的说法,
当你试图用一个空对象去调用它的方法的时候就会抛出 NPE。
现在平时开发中做的最多的就是 CRUD 操作,我们在 Dao 层返回的数据集几乎都是采用 Map 接收,于是就有了这篇文章:
Map 的判空正确做法
首先本篇文章不是分析 Map 源码,就是简单记录一下工作当中遇到的问题。
在平常开发中可能遇到最多的就是 NPE,而这其中的很多又是我们了解的不够到位和粗心导致的,比如这篇文章 Map 的判空。
isEmpty
对于 Java 集合,在对其进行操作的时候,我们一想到就是有没有这个集合本身已经封装好的方法供我们调用
public static void main(String[] args) {
Map map=new HashMap<>();
System.out.println(map);
System.out.println(map.isEmpty());
}
打印结果为:
{}
true
下面是 HashMap 中 isEmpty() 方法的源码
/**
* Returns <tt>true</tt> if this map contains no key-value mappings.
*
* @return <tt>true</tt> if this map contains no key-value mappings
*/
public boolean isEmpty() {
return size == 0;
}
Null == map
我们还能想到的就是这个对象已经等于 null 了。
public static void main(String[] args) {
Map map=new HashMap<>();
map=null;
System.out.println(map);
System.out.println(map.isEmpty());
}
打印结果:
null
Exception in thread “main” java.lang.NullPointerException
at testAll.OtherTest.ExceptionTest.main(ExceptionTest.java:20)
即,当你试图用一个空对象去调用其方法时,就会抛出 NPE。所以,这里我们应该这样做判断
null == map
Map 判空误区
因为我平时时候用 String 的时候,用顺手了,很可能上来就一个:
"".equals(map);
那么这样就错了,看代码列子:
public static void main(String[] args) {
Map map = new HashMap<>();
System.out.println("".equals(map));
if (!"".equals(map)) {
String id = (String) map.get("OrgId");
System.out.println(id);
}
}
//打印结果:
false
null
所以,我们在使用 “” 作为 map 判空的条件是无效,这是 String 判空的条件。
在继续看上面的代码,我们这里在取得 OrgId 后是强转为 String 类型,这样不会有啥问题,但是我们像下面这样呢?
String id = map.get("OrgId").toString();
看看,是不是又进入了另一个坑,我们用空对象去调用它的方法,又是一个 NPE 了…
String 的判空
上面也讲到了,String 的判空就是使用 “” 和 null:
public static void main(String[] args) {
String s="";
if("".equals(s) || null==s){
//do...
}
}
当然 String 中也有一个 lengt() 方法可以用于判空,相当于 “”.equals(s);但是 Map 则只有 isEmpty() 方法。
以上就是我在写 CRUD 过程中遇到的问题,欢迎正好在看的朋友提出建议。