资讯专栏INFORMATION COLUMN

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

zzzmh / 3300人阅读

摘要:本文,栈长将带你了解什么是空指针,还有如何有效的避免空指针。如何避免空指针下面说几个空指针的几个最常见的案例及解决之道。字符串比较,常量放前面这个时候可能为造成空指针异常,应该把常量放前面,就能避免空指针异常。

空指针是我们 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" 可获取更多,转载请原样保留本信息。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73085.html

相关文章

  • 10 深恶痛绝 Java 异常。。

    摘要:空指针异常,操作一个对象的方法或属性时会抛出这个异常。看一个示例它是受检查异常,需要进行手工捕获。类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。 异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题。 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java 异常机制。 今天,栈长来列...

    marek 评论0 收藏0
  • 关于Python谎言,别再盲目学Python

    摘要:关于的三个谎言,你一定要清楚。这是的整个知识体系图谱,对于新手来说,没必要学那么多。第四自动化测试一切关于自动化的东西,似乎都可以满足,可以满足大多数自动化工作,提升工作效率。这都是正常的,千万别急着否定自己,怀疑自己。 ...

    TZLLOG 评论0 收藏0
  • How to handle Null Pointer Exception(译)

    摘要:我们应该考虑使用字符串常量调用方法来代替使用对象调用该方法。然而如果我们通过字符串常量来调用方法,执行流程会正常进行检查方法的参数在执行方法的方法体之前,务必对方法的参数进行值检查。 原文地址作者 Sotirios-Efstathios (Stathis) Maneas译者 smallcloverThanks for your watching! java.lang.NullPoine...

    MRZYD 评论0 收藏0
  • Android实际开发bug大总结

    摘要:换句话说,环境或应用程序没有处于请求操作的适当状态。项目中异常分析引发崩溃日志的流程分析解决办法常见的出现场景状态异常非法线程操作。导致的方法出来显示消息位于该消息之后,迟迟没有执行。这时候,的超时检测结束,删除了服务中的记录。 目录介绍 1.1 java.lang.UnsatisfiedLinkError找不到so库异常 1.2 java.lang.IllegalStateExce...

    peixn 评论0 收藏0
  • 别再被各种单位迷惑:px/em/rem

    摘要:引自手册是相对长度单位。所有未经调整的浏览器都符合。特点是新增的一个相对单位,根,这个单位引起了广泛关注。目前,除了及更早版本外,所有浏览器均已支持。对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。 在他处看到一篇好文章,想记录在自己的学习笔记中,原文作者看到我转载若是介意,联系我立马就删除,附上原文链接:http://www.huolg.net/html5/htm...

    teren 评论0 收藏0

发表评论

0条评论

zzzmh

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<