程序员的老朋友“空指针”

本文探讨了Java中的空指针异常(NullPointerException),解释了其原因,如未初始化的对象、空对象调用方法等,并提供了预防措施,包括使用三目运算、Apache StringUtils、初始化默认值、Optional类以及代码规范。此外,建议使用IDE的注解和静态扫描工具进行空值检查,以增强代码的健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序员中的老朋友“空指针”,它无时不刻的会出现在你的身边,想必大家也并不陌生,所谓空指针,顾名思义,即当一个对象的值为null时,这个时候你试图访问这个对象的属性或者调用这个对象的方法,那么它就会出现。

例如:

从类结构图来看,空指针它是属于运行时异常 RuntimeException 的子类,它不是捕获型的,只有在程序运行时才可能报出来,而且会造成运行中断。

如下列举了一些常见发生空指针的情况,可能还存在其他的的原因,不在此穷举

  • 调用未初始化的对象的方法
  • 方法中传递的参数为空
  • 对空对象使用toString()方法
  • 在未检查空对象的时候使用相等比较
  • 对空对象通过synchronized 来加锁

==========================================================

通过避免空指针,可以来降低程序被异常中断的可能性,接下来将介绍一些常用的手段来提升程序的健壮性。

  1. 三目运算判断处理

如果表达式的计算结果为true,则整个表达式返回value1,否则返回value2,可使用如下代码所示的运算符

  1. 使用Apache字符串处理工具

可使用Apache commons-lang中的StringUtils.java,通过StringUtils.isNotEmpty验证作为参数传递的字符串是否为空字符串。

  1. 避免方法返回空对象

对于返回为null的情况调整为返回空字符串或空集合,即使遗漏了空检查,也不用担心空指针异常。

  1. 字符串比较

假设param作为null传递,则会出现空指针

即使param作为null传递,也不会出现空指针

  1. 初始化默认值

在对象初始化的时候给它一个默认值或者默认构造实现

  1. 断言

断言是用来检查程序的安全性的,在使用之前进行检查条件。

  1. Optional类

Java8加入了Optional类,用于避免空指针的出现,无需写大量的if(obj!=null)判断,

调整如下,虽然代码量貌似变多了,但是Optional还提供了一些其他有价值的方法。

===========================================================

除了使用上述的办法来避免空指针的出现外,我们还能借助在IDE中的@Nonnull注解或者Sonar静态扫描工具的能力进行事前代码检查,降低空指针出现的频率,同时在代码开发中需要遵循如下几条重要原则:

  • 尽早对输入进行空值检查,而非在使用时再进行检查;
  • 不要过分采用链式方式调用,虽然代码优雅,但对于代码调式时并不友好;
  • 打印任何对象的字符串形式,不使用toString(),而是使用String.valueOf;
  • 不建议定义一些可以传递部分空参数的方法,对于此次方法建议进行拆分;

另外,为了便于故障定位和排查,建议在检查出空对象的时候,增加比通常更多的信息

很显然,第二个堆栈跟踪信息量将更有帮助。

===========================================================

总结:通过以上的内容,想必大家已经对NullPointerException有了一个初步的认识,希望对你在后续的工作中有所帮忙,远离这位老朋友,代码越写越优雅。

注:文章均原创,部分图片及文字来源于网络,若涉及版权,请联系作者,将第一时间备注出处,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值