别再写 bug 了,避免空指针的 5 个案例!

简介: 空指针是我们 Java 开发人员经常遇到的一个基本异常,这是一个极其普遍但似乎又无法根治的问题。本文,栈长将带你了解什么是空指针,还有如何有效的避免空指针。

空指针是我们 Java 开发人员经常遇到的一个基本异常,这是一个极其普遍但似乎又无法根治的问题。


本文,栈长将带你了解什么是空指针,还有如何有效的避免空指针。


什么是空指针?

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


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

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

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

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


什么是运行时异常及异常的分类请看这篇文章:一张图搞清楚 Java 异常机制。


如何避免空指针?

下面说几个空指针的几个最常见的案例及解决之道。

1、字符串比较,常量放前面

if(status.equals(SUCCESS)){
}

这个时候 status 可能为 null 造成空指针异常,应该把常量放前面,就能避免空指针异常。

if(SUCCESS.equals(status)){
}

这个应该在各种开发规范里面都会提到,也是最基础的。

2、初始化默认值

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

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

3、返回空集合

在返回一个集合的话,默认会是 null,统一规范返回一个空集合。

举个 List 例子,如:

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

这样接收方就不用担心空指针异常了,也不会影响业务。

4、断言

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

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

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

输出:

Exception in thread "main" java.lang.AssertionError: 名称不正确

不过默认是不启动断言检查的,需要要带上 JVM 参数:-enableassertions 才能生效。

Java 中这个用的很少,建议使用 Spring 中的,更强大,更方便好用。

Spring中的用法:

Assert.notNull(name,"名称不能为空");

5、Optional

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


这里不再详细介绍了,具体看这篇文章:JDK8新特性之Optional。


这里大概介绍了 5 种,其实还有更多,如何避免空指针,一是要注意代码编写规范,二是要提高代码素养。在Java技术栈微信公众号后台回复关键字:Java,可以获取更多栈长整理的 Java 系列技术干货。


相关文章
|
C++
C++语言学习指针和引用应用案例
C++语言学习指针和引用应用案例
230 1
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
455 3
|
存储 C++
C++语言学习指针和引用应用案例
C++中的指针和引用用于高效操作内存。示例展示指针和引用的基本用法:指针`*p`存储变量`a`的地址,引用`&x`在函数调用中实现值交换而无需复制。此外,引用`update(&x)`可直接修改原变量,指针`p`在数组操作中用于遍历和访问不同部分。
270 2
指针配合数组和函数案例 ------ 冒泡排序
指针配合数组和函数案例 ------ 冒泡排序
192 0
指针配合数组和函数案例 ------ 冒泡排序
|
存储 Go 开发者
指针案例和使用陷阱|学习笔记
快速学习指针案例和使用陷阱。
242 0
指针案例和使用陷阱|学习笔记
|
C语言
【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
252 0
|
C语言
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(3)
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(3)
344 0
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(3)
|
C语言
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(2)
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(2)
337 0
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(2)
|
存储 C语言 C++
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(1)
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(1)
288 0
深入理解C语言指针——挑战C指针笔试题 (和bug郭一起学C系列)(1)
|
存储 编译器 C语言
C语言指针,楼下大爷都能学会的小细节(和bug郭一起学C系列)
C语言指针,楼下大爷都能学会的小细节(和bug郭一起学C系列)
395 0
C语言指针,楼下大爷都能学会的小细节(和bug郭一起学C系列)