文档章节

防止NullPointerException的最佳解决方案

snowdream
 snowdream
发布于 2016/03/01 11:16
字数 589
阅读 35
收藏 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
海淀
程序员
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基础设施...

上树的熊
07/19
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
微服务架构—链路追踪(Nginx篇)

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

李景枫
04/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
26分钟前
7
0
springboot logback日志配置

springboot 如果不使用外部tomcat的话,日志是需要自己配置的,不然的话就只有控制台的日志,但是日志又是我们在项目上了生产环境,出问题时,检查问题的唯一途径,所以我们要配置详细的日志...

曾大大胖
27分钟前
2
0
Linux服务器集体篡改时间的方法

Red Hat 虚拟化课程RH318,中小型公司使用的话,感觉可以匹敌OpenStack。手头上有一个VMware的映像,RHEV 3.5版的,只能把系统时间调整到2016年才能使用。Red Hat的RHEV已经更新到4.1版,不过...

大别阿郎
27分钟前
1
0
Tomcat启动异常:java.lang.ClassNotFoundException

警告: Name = mysqlDataSource Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "100" for "maxActive" property, wh......

hengbao5
28分钟前
1
0
GO错误的一些处理(defer,recover,panic)

package main import("fmt""errors")func main() {num := 10fmt.Printf("num的类型%T, num的值%v, num的地址%v\n", num, num, &num)num2 := new(int) //返回一个指针//num...

汤汤圆圆
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部