程序员中的老朋友“空指针”,它无时不刻的会出现在你的身边,想必大家也并不陌生,所谓空指针,顾名思义,即当一个对象的值为null时,这个时候你试图访问这个对象的属性或者调用这个对象的方法,那么它就会出现。
例如:
从类结构图来看,空指针它是属于运行时异常 RuntimeException 的子类,它不是捕获型的,只有在程序运行时才可能报出来,而且会造成运行中断。
如下列举了一些常见发生空指针的情况,可能还存在其他的的原因,不在此穷举
- 调用未初始化的对象的方法
- 方法中传递的参数为空
- 对空对象使用toString()方法
- 在未检查空对象的时候使用相等比较
- 对空对象通过synchronized 来加锁
==========================================================
通过避免空指针,可以来降低程序被异常中断的可能性,接下来将介绍一些常用的手段来提升程序的健壮性。
- 三目运算判断处理
如果表达式的计算结果为true,则整个表达式返回value1,否则返回value2,可使用如下代码所示的运算符
- 使用Apache字符串处理工具
可使用Apache commons-lang中的StringUtils.java,通过StringUtils.isNotEmpty验证作为参数传递的字符串是否为空字符串。
- 避免方法返回空对象
对于返回为null的情况调整为返回空字符串或空集合,即使遗漏了空检查,也不用担心空指针异常。
- 字符串比较
假设param作为null传递,则会出现空指针
即使param作为null传递,也不会出现空指针
- 初始化默认值
在对象初始化的时候给它一个默认值或者默认构造实现
- 断言
断言是用来检查程序的安全性的,在使用之前进行检查条件。
- Optional类
Java8加入了Optional类,用于避免空指针的出现,无需写大量的if(obj!=null)判断,
调整如下,虽然代码量貌似变多了,但是Optional还提供了一些其他有价值的方法。
===========================================================
除了使用上述的办法来避免空指针的出现外,我们还能借助在IDE中的@Nonnull注解或者Sonar静态扫描工具的能力进行事前代码检查,降低空指针出现的频率,同时在代码开发中需要遵循如下几条重要原则:
- 尽早对输入进行空值检查,而非在使用时再进行检查;
- 不要过分采用链式方式调用,虽然代码优雅,但对于代码调式时并不友好;
- 打印任何对象的字符串形式,不使用toString(),而是使用String.valueOf;
- 不建议定义一些可以传递部分空参数的方法,对于此次方法建议进行拆分;
另外,为了便于故障定位和排查,建议在检查出空对象的时候,增加比通常更多的信息
很显然,第二个堆栈跟踪信息量将更有帮助。
===========================================================
总结:通过以上的内容,想必大家已经对NullPointerException有了一个初步的认识,希望对你在后续的工作中有所帮忙,远离这位老朋友,代码越写越优雅。
注:文章均原创,部分图片及文字来源于网络,若涉及版权,请联系作者,将第一时间备注出处,谢谢。