NullPointerException空指针异常可以说是我们开发中最常遇到的Bug,因此我们处处判空,胆战心惊。

处处判空确实可以解决空指针异常的Crash。

但处处判空未免过于草木皆兵,而且写出来的代码十分不优雅,多余判断效率低下,这不是我们的Style!

这里,我们由点到面,借鉴一下Android API中Splitter类的split方法和TextView类的setText方法,我们不惧NullPointerException!

先看一下这几行项目源代码:

        String[] paraString = logPara.split("\\*");viewHolder.time_tv_networkPara.setText(paraString[0]);viewHolder.key_tv_networkPara.setText(paraString[1]);viewHolder.value_tv_networkPara.setText(paraString[2]);

我们不管它的业务意义,简单来说就是通过*分割字符串logPara,然后通过TextView显示出来。

这时,有小伙伴可能会说,如果分割出来为空,然后setText空,那不就空指针异常了吗,吓死宝宝了,赶紧判个空先。

首先,表扬这位小伙伴的风险意识,防患于未然哈,

然而,真的需要在这判空吗?

此时我抽出一个小Demo,我们一步步分析。

正常情况:

 private static final String test1 = "2017-02-06 14:25:59:939*/resxxx/xx/xxx/xxxx/xxxOrder/xxxlist*{'xxxId':'0','isXXXX':'0','xxxFlag':0}";public static void main(String[] args) {String[] paraString = test1.split("\\*");System.out.println(paraString[0]);System.out.println(paraString[1]);System.out.println(paraString[2]);}

输出:

2017-02-06 14:25:59:939
/resxxx/xx/xxx/xxxx/xxxOrder/xxxlist
{'xxxId':'0','isXXXX':'0','xxxFlag':0}

理想结果,ok~

那么我们测一把为空情况呢?

private static final String test2 = "2017-02-06 14:25:59:939**{'xxxId':'0','isXXXX':'0','xxxFlag':0}";

        String[] paraString = test2.split("\\*");System.out.println(paraString[0]);System.out.println(paraString[1]);System.out.println(paraString[1] == null);System.out.println(paraString[1].equals(""));System.out.println(paraString[2]);

输出:

2017-02-06 14:25:59:939

false
true
{'xxxId':'0','isXXXX':'0','xxxFlag':0}
此时paraString[1]值为"",但并不为空,因此不存在分割出来为空的情况,最多只是""。不用判空!

在这里我们可以追一下Android API源代码,打破砂锅问到底,知道原理方能决定是否判空,从而游刃有余。

从Sting:

    public String[] split(String regularExpression, int limit) {String[] result = java.util.regex.Splitter.fastSplit(regularExpression, this, limit);return result != null ? result : Pattern.compile(regularExpression).split(this, limit);}

到Pattern:

    public String[] split(CharSequence input, int limit) {return Splitter.split(this, pattern, input.toString(), limit);}

再到Splitter:

AndroidSDK/sources/android-23/java/util/regex/Splitter.java

    public static String[] split(Pattern pattern, String re, String input, int limit) {String[] fastResult = fastSplit(re, input, limit);if (fastResult != null) {return fastResult;}// Unlike Perl, which considers the result of splitting the empty string to be the empty// array, Java returns an array containing the empty string.if (input.isEmpty()) {return new String[] { "" };}
···

如果为空,则返回一个array,array里有一个空字符串。因此分割出来不会为空,自然不需要判空。

退一步来说,如果遇到其他case,字符串为空,我们setText一个空字符串时是否会有问题呢?

同样,在这里我们追一下Android API源代码,打破砂锅问到底,知道原理方能决定是否判空,从而游刃有余。

AndroidSDK/sources/android-23/android/widget/TextView.java

setText(CharSequence text)

->setText(CharSequence text, BufferType type)

->setText(CharSequence text, BufferType type,boolean notifyBefore, int oldlen)

        if (text == null) {text = "";}

至此,真相大白,如果为空,赋值"",不用判空。

小结ing:

1.追溯Android API,打破砂锅问到底,知道原理方能决定是否判空,从而游刃有余,不惧NullPointerException,写出更加优雅的代码。

2.借鉴Android API(Splitter-split和TextView-setText),处理各种case,写出更加健壮的代码。

文末彩蛋:

看到这,小小的过瘾一把,

追加更加优雅,更加健壮的代码是我们不变的信念。

然而,话说回来,有没有觉得什么地方不对劲?

别往下看,先自己沉思三分钟,什么?没啥不对劲?

回过头从头看一遍,什么?挺好的?

哈哈,前面说的是不错,不过有一个问题。

这里确实没有空指针异常,也不需要判空,但是:

添加代码:

System.out.println(paraString[3]);

可能会碰到另一个我们时不时遇见的Bug,

数组越界:java.lang.ArrayIndexOutOfBoundsException

这里就根据自己的业务需求个人处理了~

权兴权意-品质为真

原创不易,转载请注明出处哈。

http://blog.csdn.net/hxqneuq2012/article/details/54892425

项目实战:借鉴Android API源码(Splitter-split和TextView-setText),不惧NullPointerException(文末彩蛋)相关推荐

  1. Android 如何在Eclipse中查看Android API源码 及 support包源码

    http://blog.csdn.net/vipzjyno1/article/details/22954775     当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都是 ...

  2. 如何在Eclipse中查看Android API源码以及support包源码

    http://my.eoe.cn/futurexiong/archive/181.html 开发第三方Android应用的,大多数人应该还是Eclipse结合ADT来开发.那么大多数时候我们可能希望点 ...

  3. api商品分享源码_SSM框架高并发和商品秒杀项目高并发秒杀API源码免费分享

    前言: 一个整合SSM框架的高并发和商品秒杀项目,学习目前较流行的Java框架组合实现高并发秒杀API 源码获取:关注头条号转发文章之后私信[秒杀]查看源码获取方式! 项目的来源 项目的来源于国内IT ...

  4. android从入门到精通-项目实战(心得及源码)

    个人心得 这个周的时间,我用了三天的时间跟着书籍上面的内容实现了,家庭理财通这个小的app,算是用来练手的开始.首先开始实现的时候,我是先从项目的架构开始,首先你的先理解者这个APP具体是干什么的,有 ...

  5. SpringBoot+SpringCloud+Mybatis+Vue 电商项目实战,附视频+源码+文档,包含所有主流技术栈。...

    大家好,我是树哥. 今天给大家分享一个电商项目--- 畅购商城.项目采用前后端分离的技术架构. 采用SpringBoot+SpringCloud+Mybatis+Vue为主要技术栈,包括了大型商城的主 ...

  6. SpringBoot+SpringCloud+Mybatis+Vue电商项目实战,附视频+源码+文档,包含所有主流技术栈...

    今天给大家分享一个电商项目--- 畅购商城.项目采用前后端分离的技术架构. 采用SpringBoot+SpringCloud+Mybatis+Vue为主要技术栈,包括了大型商城的主要功能.难点功能以及 ...

  7. Python项目实战——外汇牌价(附源码)

    前言 几乎每个人都在使用银行卡,今天我们就来爬取某行外汇牌价,获取我们想要的数据. 环境使用 python 3.9 pycharm 模块使用 requests 模块介绍 requests reques ...

  8. 【Python】从0到1:一文教会你如何用Python制作好看又实用的二维码!【文末彩蛋!】(可直接copy + 运行哦~!)

    Hi~ o(* ̄▽ ̄*)ブ!你好吖~! 经过 "作业雨 " 的 "洗礼",我终于又回来啦!!! 今天又有什么 "惊喜" 捏?! 往下看叭~! ...

  9. android 关联源码

    当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都是已经写好的方法和控件,可是我们只是在搬来使用,不知道它的原理,它是如何被实现的.android系统是开源的,所以谷歌官方 ...

最新文章

  1. 基于jquery多种切换效果的焦点图(兼容ie6)
  2. C++ leetcode 5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
  3. CSS实例:图片导航块
  4. 读jquery 权威指南[7]-性能优化与最佳实践
  5. 算法学习笔记(5)-------位运算的tips
  6. 纯VB代码取得硬盘的物理序列号
  7. 常见计算机基础笔试题总结quickstart
  8. R语言初级教程: NA、Inf、NaN、NULL 特殊值
  9. 17.go 面向对象 interface
  10. wdr7300百兆版_TPLINK WDR7660千兆版无线路由器拆机
  11. office2016鼠标右键没有新建word等
  12. 51中断编程c语言,有关51单片机中断的形式和C语言编程格式[精选5篇]
  13. 清除tomcat缓存HTML,清除Tomcat缓存
  14. idea错误:否则 JavaFX 应用程序类必须扩展javafx.application.Application
  15. JuliaFEM中的数据格式——fields.jl
  16. python数据分析中data_dict={h:v for h,v in zip(header,zip(header,zip(*value)}的含义
  17. 加油站都需要什么手续_企业自备加油站需要办理哪些手续
  18. ei会议论文录用但不参加会议_同一个EI会议录用的文章一定全部都进EI吗?
  19. VS2015 密钥 专业版和企业版
  20. 2022年可可香精市场前景分析及研究报告

热门文章

  1. 金融大数据模型分享-股市评论数据情感分析
  2. 解决npm install 失败问题
  3. 如何导入本地镜像到阿里云ECS服务器
  4. BeautifulSoup爬取贝壳网成都二手房源信息(附:完整源代码)
  5. 路由器限制计算机访问,路由器如何禁止设备访问指定网站?
  6. NodeJs 学习资料
  7. DocuWare 文件管理与工作流程自动化案例研究——DocuWare 工作流程功能使在家工作的员工能够保持沟通和高效工作,支持混合环境
  8. amdgpu kfd TTM create GTT
  9. oracle数据库 uga,Oracle内存结构
  10. python例子高考志愿填报系统入口_江苏2018年高考模拟志愿填报入口(官方)