首先NullPointerException是RuntimeException的一个子类,这是运行时,在编译时期不会触发,所以这是最最最容易出现的线上bug;

空指针常见原因和解决办法_子类

容易出现空指针异常的场景

在调用对象方法时

比如处理字符串常用的replace方法,数组的length方法,map的size方法等等;
str.replace(…)
如果str为null,这里就直接空指针了
判断一个str是否等于"test",你直接str.equals(“test”)
还有像map.forEach()、list.stream() 、object.equals()、str.toString()…
类似的还有很多,太多了

在判断对象是否为空时

这个是最坑的,导致空指针的原因就是在调用对象方法时没有对对象判空,但是有些小伙伴往往就是在这个环节出问题,明明对象判空的目的就是避免空指针,好家伙,到头来这成了罪魁祸首
比如你在调用str.replace(…)时,意识到这里应该对str做判断,不为空才调用replace方法
于是你开开心心一脸自信
if(!str.isEmpty()){
str.replace(…)
}
或者
if(str.length()>0){
str.replace(…)
}
这么一套操作下来以为自己的代码天衣无缝,这破公司已经容不下我了
万万没想到从一个坑掉进了另一个坑
str.isEmpty()、str.length()自身也会造成空指针
嘤嘤嘤~~~

对象判空技巧

我就直接给出几个常用的
StringUtils.isNotBlank(str)
StringUtils.isNotEmpty(str)
object != null
太多了,这里不一一列举

总结和技巧

在调用对象方法前先判断对象是否为空(不管是实体、变量、常量、map、list还是其他什么)
在判断对象是否为空时注意不要直接调用判空方法,判空方法特么也是方法
尽量不要用str.toString(),改用String.valueOf()
比如你要判断一个str是否等于"test",你不要str.equals(“test”),可以反过来"test".equals(str)

避免空指针远不止上面这些方法,更多的还需要自己总结经验。


嘤~好紧张
嘤~好害羞