文档章节

防止NullPointerException的最佳解决方案

snowdream
 snowdream
发布于 2016/03/01 11:16
字数 589
阅读 62
收藏 1

同步发布在:http://snowdream.github.io/blog/2016/02/18/android-avoid-null/

NullPointerException在bug跟踪时经常发现,如何防止? 主要分阶段进行:

一. 开发阶段

1.方法的返回值尽量返回空对象,而不是null

  • 对于数组,比如GeoPoint,返回空对象,return new GeoPoint[0];
  • 对于容器,比如ArraryList,返回空对象。如果需要泛型支持,retrun Collections.emptyList(); 如果不需要泛型支持,则 return Collections.EMPTY_LIST; 详细内容,参考:http://moto0421.iteye.com/blog/1447836
  • 对于字符串String,返回空对象, return ""; 而不是return null;
  • 对于其他对象,如果可以定义空对象/初始对象,则return这个对象。否则,return null,并采用下面一种方法;

2.使用android annotations注解库

对于方法需要返回null的情况下,在方法的头部加上一个nullable的注解。

通过IDE来检测可能出现的空指针,并提出警告。 以Intellij Idea为例,这里需要设置一下。 默认情况下Intellij Idea没有使用support-annotations.jar中的annotation来做nullity的分析。需要在preferences中配置。

先找到Preferences -> Inspections, 搜索 Nullable, 找到 Probable bugs中的 @NotNull/@Nullable problems。 screenshot

screenshot

选择 Configure Annotations screenshot

在弹出窗口中分别添加并选中 support lib 中的 Nullable/NonNull。

screenshot

之后Intellij Idea会报告代码中可能存在的NullPointException的问题,也可以把 Severity 从Warning改为Error,这样更醒目。

3.其他

  • 避免使用以下方式进行调用:A.getB().getC().getD() 这样做很危险,只要中间有一个返回null,就出现空指针了。
  • 使用单例的时候要慎重。尤其不能将有生命周期的对象做单例。 ...

二. 测试阶段

1.持续集成

通过Jenkins + Findbugs/Lint等插件,来实时检查每次build中存在的问题。比如,出现空指针,或者可能出现空指针的情况,及时修改。

2.测试

  • 通过Monkey来帮助发现问题,对于发现的空指针进行及时修改。
  • 通过QA测试反馈,对于发现的空指针进行及时修改。

三. 用户反馈

通过对用户反馈,以及在线崩溃日志进行分析,对于其中的问题进行及时修改。

最后总结一下:不要把问题留给用户,尤其是会导致崩溃的问题,比如空指针。

© 著作权归作者所有

共有 人打赏支持
snowdream

snowdream

粉丝 20
博文 12
码字总数 6591
作品 15
海淀
程序员
私信 提问
在 Java 8 中避免 Null 检查

如何预防 Java 中著名的 NullPointerException 异常?这是每个 Java 初学者迟早会问到的关键问题之一。而且中级和高级程序员也在时时刻刻规避这个错误。其是迄今为止 Java 以及很多其他编程语...

ApacheCN飞龙
2016/02/04
8.1K
24
Windows Android Studio生成javadoc

Tools -> Generate Javadoc... 一般生成doc会有2个问题 解决方案都是在Other command lind arguments中设置 1. NullPointerException异常 方案:-bootclasspath D:Softandroid-sdk-windowsp......

xingjm8511
2016/05/19
14
0
Spring Roo 1.3.1 RC2 发布,企业应用开发框架

Spring Roo 1.3.1 RC2 发布,此版本的 jar 文件发布到了 Maven 中心库,其他下载提供在 Spring IO 库。 RC 版本解决的 issues 如下: NullPointerException at WarPackaging [ROO-3566] Null...

oschina
2015/01/20
3.1K
9
使用RecycleView过程中提示在computeVerticalScrollRange方法中未空

问题的解决方案如下链接所述,其实就是没有确定recycleView的LayoutManager,本来就是准备再BaseFragment中增加一个RecycleView,以便让子类继承使用,没想到一来就栽了这个坑,o(╯□╰)o....

tyronejw
2016/03/07
113
0
java.net.MalformedURLException异常说明

1.异常片段 Java代码中,在进行URL url = new URL(urllink)操作时,提示以下异常信息,该类异常主要问题出在参数urllink上面。 异常片段1

lqlm
07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty 简单服务器 (三)

经过对Netty的基础认识,设计模型的初步了解,来写个测试,试试手感 上篇也说到官方推荐我们使用主从线程池模型,那就选择这个模型进行操作 需要操作的步骤: 需要构建两个主从线程组 写一个服务器...

_大侠__
5分钟前
0
0
day02:管道符、shell及环境变量

1、管道符:"|" 用于将前一个指令的输出作为后一个指令的输入,且管道符后面跟的是命令(针对文档的操作):cat less head tail grep cut sort wc uniq tee tr split sed awk等) [root@localho...

芬野de博客
15分钟前
5
0
Kubernetes系列——Kubernetes 组件、对象(二)

一、Kubernetes 组件 介绍了Kubernetes集群所需的各种二进制组件。 Master 组件 Master组件提供集群的管理控制中心。Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一...

吴伟祥
25分钟前
8
0
Flink-数据流编程模型

1、抽象等级 Flink提供了不同级别的抽象来开发流/批处理应用程序。 1) 低层级的抽象 最低层次的抽象仅仅提供有状态流。它通过Process函数嵌入到DataStream API中。它允许用户自由地处理来自一...

liwei2000
43分钟前
6
0
Java开发Swing实战JFrame和JTabbedPane容器的用法详细解析

概述: 项目是一个桌面程序,涉及标签和按钮组件、布局管理器组件、面板组件、列表框和下拉框组件等组件,以及Swing事件处理机制。 下面先从最基础的界面开始。 /** * @author: lishuai * @...

金铭鼎IT教育
48分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部