18.7.23
1、自动拆箱有可能产生NPE。
类的Integer属性没有set值,直接在其他函数调用get方法,返回int类型。
Integer类型向int类型解箱。如果Integer类型为null,解箱就会抛异常NPE。
2、Equals
Apple.equals("苹果"),如果Apple为null,则会抛异常NPE。
所以一般("苹果").equals(Apple)
3、Map下NPE
Map 类集合 K/V 能不能存储 null 值的情况,如下表格:
集合类 Key Value Super 说明
Hashtable 不允许为 null 不允许为 null Dictionary 线程安全
ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 分段锁技术
TreeMap 不允许为 null 允许为 null AbstractMap 线程不安全
HashMap 允许为 null 允许为 null AbstractMap 线程不安全
不允许为null的key和value,被不小心getA()获取为null的情况,抛异常NPE。
4、遍历List的时候add/remove
遍历List的时候要用Iterator,期间可以add/remove
使用for遍历List调用add/remove容易出问题。
5、Arrays.toList(),得到的List调用add/remove会报错,NPE
asList() 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。
6、List的toArray() 集合转换数组,使用无参数的会报错NPE。
使用有参数的就没问题。
String[] array = new String[list.size()];
array = list.toArray(array);
7、subList 的使用
靠subList方法返回的新集合是靠原来的集合支持的,修改都会影响到彼此对方。在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均产生异常。
8、级联调用容易产生NPE
if(!CollectionUtils.isEmpty(list))即使判断空了,但是内部的对象也容易为null抛出异常。
补充:
1、数据库的查询结果可能为 null。
2、远程调用对象时,一律要求进行空指针判断,防止 NPE。
3、对于Session 中获取的数据,建议 NPE 检查,避免空指针。
4、级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。
参考:http://www.cnblogs.com/mafly/p/trap.html
https://blog.csdn.net/u013310517/article/details/78219861
网友评论