1 概述
本篇博客接上一篇博客:
系统运维系列 之java.lang.NullPointerException出现原因研究和解决方案分析
继续探讨容器为空和为null的区别。
2 主要内容
(1) 指针异常都是因为调用null对象的方法,就是一个对象还没有没有正常初始化 就先调用它的方法;程序在使用或访问一个对象的引用时,而该对象等于null则被抛出。
(2) Java中新建一个list对象,默认值是空,而非null;而当我们连接数据库查询返回集合,当没有查询到数据时,返回的集合便是null。
(3) 使用一个对象前先判断是否为空,if(xxx!=null)再进行下一步的操作:
equal方法的时候,把不为空的放前面,比如 "xxx".equals(test),字符串"xxx"是不可能为空,错误的写法为:test.equals("xxx"),这个时候test为空的时候,就有可能抛空指针异常。
(4) String类型的对象可以做如下判断:
//trim()的作用:去掉字符串首尾的空格
if(str!=null && !"".equals(str.trim()))
(5) 使用三元运算符:
布尔表达式 ? value1:value2;
String message = (str == null) ? "" : str.substring(0,10);
(6) 使用contains(),containsKey(),containsValue()方法:
//例1:可能会抛出异常
Map <String,Object> map = ...
String key = ...
String value = map.get(key);
System.out.println(value.toString()); //如果值为null,则会抛出异常
//例2:通用做法,做一步检查
Map <String,Object> map = ...
String key = ...
if(map.containsKey(key){
String value = map.get(key);
System.out.println(value.toString()); //不会抛出异常
}
(7) java中List<Map<String, Object>>关于null的判断:
List<Map<String, Object>> test = fileService.select(test);
Map<String, Object> testMap = subSelect.get(0);
//相当于testMap == null || testMap.isEmpty()
//testMap.isEmpty() 也相当于 testMap.size() == 0
//先判断是否为null再判断是否为空
if(CollectionUtils.isEmpty(testMap)){
}
(8) 在进行集合判空时,能用Collection.isEmpty(testList)的就不要用testList.size(),isEmpty不仅可以判断集合是否为null,在时间复杂度上也更优秀:
方法一(数据量大,效率低):if(list!=null && list.size()>0){
}
方法二(数据量大,效率高):if(list!=null && !list.isEmpty()){
}