老男孩的成长之路

万恶的 NPE 如何避免,几种你必须知道的方案!!!

2020-07-17  本文已影响0人  路人甲java
image.png

前言
空指针异常在开发中可谓是防不胜防,对于这类异常,预防胜于治疗。那么如何能够有效的预防呢?今天陈某来聊一聊如何预防空指针的异常。

什么是空指针?
当一个变量的值为 null 时,在 Java 里面表示一个不存在的空对象,没有实际内容,没有给它分配内存,null 也是对象成员变量的默认值。

所以,一个对象如果没有进行初始化操作,这时候,如果你调用这个对象的方法或者变量,就会出现空指针异常。

如下面示例会发生空指针异常:

Object object = null;
String string = object.toString();

关于异常的分类,什么是运行时异常,什么是编译时异常,这里不再赘述,未了解的朋友可以查阅相关的文章,这个在初级面试中还是比较常问的一类问题。

如何避免空指针异常?
下面说说几个预防空指针的方案。

字符串比较,常量放在前面
对于初级开发者这是个最常见的坑,老司机基本都知道,示例如下:

if(status.equals("success")){
}

上述代码中,如果status为null将会抛出空指针异常,一种避免的方法就是将常量放在前面,如下:

if("success".equals(status)){
}

使用null安全的方法库
作为Java开发者,用的最多的就是Apache的StringUtils,其中的许多方法使用很方便并且不用担心空指针异常,比如StringUtils.isBlank(),isNumeric(),isWhiteSpace()。

初始化默认值
在给对象初始化的时候给他一个默认值或者默认的构造实现,如下:

User user = new User();
String name = StringUtils.EMPTY;

返回空集合
在返回集合的时候如果是null,统一默认返回一个空集合,如下:

public List getUserList(){
    List list = userMapper.gerUserList();
    return list == null ? new ArrayList() : list;
}

此时方法调用者将不会担心空指针异常了。

断言
断言是用来检查程序的安全性的,在使用之前进行检查条件,如果不符合条件就报异常,符合就继续。

Java 中自带的断言关键字:assert,如:

assert name == null : "名称不能为空";

除了Java自带的断言,可以使用一些方便的开源库或者自己实现,具体根据开发要求。

Optional
Optional 是 JDK 8 新增的新特性,再也不用 != null 来判断了,这个在一个对象里面的多个子对象连续判断的时候非常有用。

Optional非常强大,想要熟练的使用还是要下一番功夫的,篇幅较大,这里不再细说,想了解的朋友可以查阅相关的文章,这里简单的举个例子,如下:

String version = computer.flatMap(Computer::getSoundcard)
     .flatMap(Soundcard::getUSB)
     .map(USB::getVersion)
     .orElse("UNKNOWN");

避免你的代码中不必要的自动包装和自动解包
不管其他如创建临时对象的缺点,如果wrapper类对象是null,自动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。

Person ram = new Person("ram");
int phone = ram.getPhone();

当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

定义数据库中的字段是否可为空
作为Java开发者,一切的业务都离不开数据库,表中的字段定义不允许为null能够有效的避免代码中的空指针异常。

总结
本篇文章讲了在实际开发中避免空指针的几种切实可行的几种方法,喜欢的朋友们点点在看,欢迎转发,谢谢支持!!!

上一篇 下一篇

猜你喜欢

热点阅读