文档章节

防止NullPointerException的最佳解决方案

snowdream
 snowdream
发布于 2016/03/01 11:16
字数 589
阅读 22
收藏 1
点赞 1
评论 0

同步发布在: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
海淀
程序员
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
添加@Transactional ------spring boot中session中断的问题及其解决

近期做收益项目,大规模使用spring的定时任务,然一些错误如Null Session,Not Proxy.代码无法应用. 前段时间查了下,发现一些解决方案.主要是查询之后session已经关闭,最佳方案是修改session的作...

流光韶逝
2016/11/23
43
0
缓解ddos攻击的有效解决办法

因为防火墙无法处理所有类型的ddos攻击,下一代防火墙生成内置的DDoS防御,但是无法处理所有类型的攻击。对抗DDoS攻击的最佳做法是有专属的设备或者服务在攻击透过防火墙或者其他的IT基础设施...

上树的熊
今天
0
0
微服务架构—链路追踪(Nginx篇)

阅读提示:本文不提供链路追踪的完整解决方案,只提供Nginx层对链路追踪的支持方案! 1 背景介绍 微服务的诞生,解决了传统单体应用的很多问题,如可维护性差、扩展性差和灵活性差等问题(粗...

李景枫
04/06
0
0
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
RFI、RFQ、RFP、IFB的区别

【信息邀请书】 Request For Information (RFI) 信息邀请书 A solicitation document used to obtain general information about products, services, or suppliers. It is an information ......

seabird130
2015/09/22
63
0
使用RecycleView过程中提示在computeVerticalScrollRange方法中未空

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

tyronejw
2016/03/07
113
0
McAfee与RSA达成安全技术战略合作协议

北京时间2月16日消息,据国外媒体报道,McAfee与EMC旗下信息安全事业部RSA宣布达成技术合作伙伴关系,为客户提供集成安全解决方案以确保在IT环境下的信息安全。 McAfee 总裁兼CEO戴夫·德沃特...

红薯
2011/02/16
344
1
测测你的Java基础

Let's get started <<< 1)关键字volatile、transient各有什么作用? 2)下面两种使用synchronized关键字的方式有什么区别? // 第一种 synchronized(this) { ... } // 第二种 synchronized......

欧阳锋
2017/03/19
0
0
Java自定义Exception

这里总结一下Java的Exception,并实现一个自定义Exception类。 总结: Throwable对象分为两种类型:Error(表示编译时和系统错误);Exception(在Java类库、用户方法以及运行时故障中抛出的异常...

Triangle23
2014/12/02
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Kafka设计解析(一)- Kafka背景及架构介绍

原创文章,转载请务必将下面这段话置于文章开头处。(已授权InfoQ中文站发布) 本文转发自技术世界,原文链接 http://www.jasongj.com/2015/03/10/KafkaColumn1 摘要   Kafka是由LinkedI...

mskk
3分钟前
0
0
使用Service Mesh整合您的微服务架构

在微服务架构的世界中,它正在达到这样的程度,即管理系统的复杂性对于利用它带来的好处变得至关重要。 目前,如何实现这些微服务不再是一个问题,因为有很多可用的框架(Spring Boot,Vert....

xiaomin0322
6分钟前
0
0
看看 LinkedList Java 9

终于迎来了 LinkedList 类,实现的接口就有点多了 Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>。LinkedList是一个实现了List接口和Deque接口的双端链......

woshixin
25分钟前
0
0
算法 - 冒泡排序 C++

大家好,我是ChungZH。今天我给大家讲一下最基础的排序算法:冒泡排序(BubbleSort)。 冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大(可以相反),就交换他们两个。 对每...

ChungZH
28分钟前
0
0
jquery ajax request payload和fromData请求方式

请求头的不同 fromData var data = { name : 'yiifaa'};// 提交数据$.ajax('app/', { method:'POST', // 将数据编码为表单模式 contentType:'application/x-ww...

lsy999
30分钟前
0
0
阿里P7架构师,带你点亮程序员蜕变之路

前言: Java是现阶段中国互联网公司中,覆盖度最广的研发语言。 掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,成为Java架...

Java大蜗牛
31分钟前
1
0
Ecstore 在没有后台管理界面(维护)的情况如何更新表的字段

window 系统: 切换到:app\base 目录下: C:\Users\qimh>d: D:\>cd D:\WWW\huaqh\app\base 执行:D:\WWW\huaqh\app\base>cmd update linux 系统: 1># cd /alidata/www.novoeshop.com/app/......

qimh
36分钟前
0
0
设计模式-策略模式

策略模式 解释 对工厂模式的再次封装,使用参数控制上下文信息(将工厂返回的实例赋值给context field) 不会返回bean实例,只是设置对应的条件 调用context的方法(调用field的方法) 用户只...

郭里奥
39分钟前
0
0
python使用有序字典

python自带的collections包中有很多有用的数据结构可供使用,其中有个叫OrderedDict类,它可以在使用的时候记录元素插入顺序,在遍历使用的时候就可以按照原顺序遍历。 a = {"a":1,"b"...

芝麻糖人
今天
0
0
RestTemplate HttpMessageConverter

RestTemplate 微信接口 text/plain HttpMessageConverter

微小宝
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部