万恶的NPE如何避免,这几种方案你必须知道!!!
-
空指针异常在开发中可谓是防不胜防,对于这类异常,预防胜于治疗。那么如何能够有效的预防呢?今天陈某来聊一聊如何预防空指针的异常。
什么是空指针?
-
当一个变量的值为 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能够有效的避免代码中的空指针异常。
总结
-
本篇文章讲了在实际开发中避免空指针的几种切实可行的几种方法,喜欢的朋友们点点在看,欢迎转发,谢谢支持!!!