文档章节

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

Java技术栈
 Java技术栈
发布于 01/18 15:00
字数 927
阅读 39
收藏 8

空指针是我们 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 系列技术干货。

大家都有什么高见,欢迎留言分享!

本文原创首发于公众号:Java技术栈(id:javastack),关注公众号在后台回复 "Java" 可获取更多,转载请原样保留本信息。

© 著作权归作者所有

共有 人打赏支持
Java技术栈
粉丝 147
博文 134
码字总数 116642
作品 0
深圳
架构师
私信 提问
写了多年的Java,直到看到Kotlin,原来代码可以如此优雅!

写了多年的Java,直到看到Kotlin,原来代码可以如此优雅! 如果你是像我一样是一名 优秀 的Java开发者 _ ,而且已经想用kotlin来实现你的程序,那么,抱歉!不要用Java的语法思维来写Kotlin,...

程序员诗人
2018/04/19
0
0
10 个深恶痛绝的 Java 异常。。

异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题。 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java 异...

Java技术栈
02/15
0
0
程序员减少代码BUG的7种方法,拒绝编程5分钟,查代码2小时!

  编程5分钟,查代码2小时!   在程序员的编程生涯,免不了和BUG打交道,甚至有些程序员被BUG虐杀的苦不堪言。   当有人指出程序员代码有BUG时,程序员的回答各有不同:   1、不可能啊...

W3Cschool小编
2017/12/22
0
0
LuckyFrame V2.7.1 正式版发布,一站式自动化测试平台

时隔V2.7 Beta版本发布整整两个月,再一次跟大家见面咯,这一次我们带来了LuckyFrame V2.7.1 正式版,为何此次版本没有命名V2.7正式版?因为此版本不仅仅是针对V2.7 Beta的修复版本了,对平台...

海鸥seagull
2018/11/22
507
0
编程常见bug检查1

总结一些日常工作常见的代码和编程情况,会分几个文章写出,也许对一些朋友有些作用 一、基础风格 1、设计函数参数时,请注意函数参数的顺序和个数 *一般而言,建议输入参数在前,输出参数在...

钰欣如心
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware下centos7.x 用yum快速搭建LAMP平台

实验环境: [root@nmserver-7 html]# cat /etc/redhat-release CentOS release 7.3.1611 (AltArch) [root@nmserver-7 html]# uname -aLinux nmserver-7.test.com 3.10.0-514.el7.cent......

皇冠小丑
34分钟前
1
0
搜索引擎(Solr-索引详解)

时间字段类型特别说明 Solr中提供的时间字段类型( DatePointField, DateRangeField,废除的TrieDateField )是以时间毫秒数来存储时间的。 要求字段值以ISO-8601标准格式来表示时间:YYYY-MM...

这很耳东先生
今天
4
0
Java成神之路

1、基础篇 01、面向对象 → 什么是面向对象 面向对象、面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 JVM 还支持哪些语言(Kotlin、Groovy、JRuby...

asdf08442a
今天
3
0
dubbo源码分析-服务导出

简介 dubbo框架spring Schema扩展机制与Spring集成,在spring初始化时候加载dubbo的配置类。 dubbo服务导出的入口类是ServiceBean的onApplicationEvent方法 ServiceBean的继承关系如下 publ...

王桥修道院副院长
今天
2
0
QQ音乐的动效歌词是如何实践的?

本文由云+社区发表 作者:QQ音乐技术团队 一、 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果。当然,我...

腾讯云加社区
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部