android( java) 处理 null 和 预防空指针异常(NullPointerException) 的一些经验。
概述:
在实际编码中总是会遇到 空指针异常 ,本文总结了一些处理空指针的个人经验。
原则:
尽早的检查,尽早的失败。
比如: 通过intent传参到新的目标 activity,而且一定需要这个参数,那么在新的目标activity中 onCreate方法中 判断中这个参数,如果null,直接抛出空指针异常让程序崩溃。取代在使用该参数时进行检查,这样能更早的发现问题。或者在 一个普通的方法中,一个 参数必须不能为null ,那么我们在这个方法的第一行就做出判断,如果参数为null,抛出空指针异常。
一些方法:
1. 不要在Set中使用null
2. 不要把null作为map的键值。
3. 尽可能的尽早检查,如果为 null 不执行或者 结束本方法
4. 遇到必须的参数,比如通过intent传参到新的目标 activity,而且一定需要这个参数,那么在新的目标activity中判断是否有参数
     if(getIntent() == null) throw new NullPointerException("缺少必须的参数");
        if(!getIntent().hasExtra("argument_name")) throw new NullPointerException("缺少必须的参数");
5. 判断字符串是否空
     if(TextUtils.isEmpty(str)){
            //doSometing
        }
6. 对字符串比较时,如果和常量进行比较,把常量放在前面,比如:
 “good".equals(var)  优于  var.equals("good")
7. 将 某个对象 toString时,比如:
String.valueOf(obj) 优于 obj.toString()
8. 使用注解 @NonNull 和 @Nullable 配合AndroidStudio 帮你检查你是否没有检查可能为null的对象,或者你是否做了多余的检查。
9. 我们引用Guava来帮忙检查 null 的情况,我们使用 checkNotNull 方法来替代写 if( obj == null) throw new NullPointExcetion(); ,示例:
    public void print2(@NonNull MyObject act) {
        checkNotNull(act);
        Log.i(TAG, "print2 " + act.name);
    }
扩展:
Guava是什么:
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
Guava工具类对Null值都采用快速失败操作
添加项目引用
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile "com.google.guava:guava:18.0"
}
参考:
http://ifeve.com/google-guava/
android( java) 处理 null 和 预防空指针异常(NullPointerException) 的一些经验。的更多相关文章
- IOS, Android, Java Web Rest :  RSA 加密和解密问题
		
IOS, Android, Java Web Rest : RSA 加密和解密问题 一对公钥私钥可以使用 OpenSSL创建, 通常 1024位长度够了. 注意: 1. 公钥私钥是BASE64编码的 ...
 - JDK1.6 Java.lang.Null.Pointer.Exception
		
先来看一下JDK1.6的API: NullPointerException (Java Platform SE 6) public class NullPointerException extends ...
 - Android MVP Presenter 中引发的空指针异常
		
一.概述 最近对 googlesamples/android-architecture 中的 MVP-dagger 进行了学习.对照项目的 MVP-dagger 分支,对 MVP-dagger 进行了 ...
 - .NET/android/java/iOS AES通用加密解密(修正安卓)
		
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
 - Android java传递int类型数组给C
		
接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...
 - Android java传递string类型数据给C
		
本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ...
 - .NET/android/java/iOS  AES通用加密解密
		
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
 - android Java BASE64编码和解码二:图片的编码和解码
		
1.准备工作 (1)在项目中集成 Base64 代码,集成方法见第一篇博文:android Java BASE64编码和解码一:基础 (2)添加 ImgHelper 工具类 package com.a ...
 - android  java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题
		
android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题 jav ...
 
随机推荐
- php手撸轻量级开发(一)
			
聊聊本文内容 之前讲过php简单的内容,但是原生永远是不够看的,这次用框架做一些功能性的事情. 但是公司用自己的框架不能拿出来,用了用一些流行的框架比如tp,larveral之类的感觉太重,CI也不顺 ...
 - SQL 游标 Cursor 基本用法
			
/* table1结构如下 id int name varchar(50) */ declare @id int ) declare cursor1 cursor for --定义游标cursor1 ...
 - Stream 与 byte[] 互转
			
public byte[] StreamToBytes(Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(byt ...
 - spring 注解与配置文件启动配置使用原理
			
遇到个问题注解配置文件调用配置文件JSF服务,worker起不来. 待续...
 - 安卓 logcat设置 Android logcat Settings
			
安卓 logcat设置 Android logcat Settings 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 3131 ...
 - BZOJ.3693.圆桌会议(Hall定理 线段树)
			
题目链接 先考虑链.题目相当于求是否存在完备匹配.那么由Hall定理,对于任意一个区间[L,R],都要满足[li,ri]完全在[L,R]中的ai之和sum小于等于总位置数,即R-L+1.(其实用不到H ...
 - 洛谷.4897.[模板]最小割树(Dinic)
			
题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...
 - Oozie分布式工作流——从理论和实践分析使用节点间的参数传递
			
Oozie支持Java Action,因此可以自定义很多的功能.本篇就从理论和实践两方面介绍下Java Action的妙用,另外还涉及到oozie中action之间的参数传递. 本文大致分为以下几个部 ...
 - 集合(2)—Collection之List的使用方法
			
声明集合变量 List list = new ArrayList(); 或者 : public LIst list: public 构造函数(){ this.list = new ArrayList( ...
 - ScrollView不能包含多个子项,ScrollView can host only one direct child
			
http://debuglog.iteye.com/blog/1441828 ScrollView不能包含多个子项,ScrollView can host only one direct child ...