项目实战:借鉴Android API源码(Splitter-split和TextView-setText),不惧NullPointerException(文末彩蛋)
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(文末彩蛋)相关推荐
- Android 如何在Eclipse中查看Android API源码 及 support包源码
http://blog.csdn.net/vipzjyno1/article/details/22954775 当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都是 ...
- 如何在Eclipse中查看Android API源码以及support包源码
http://my.eoe.cn/futurexiong/archive/181.html 开发第三方Android应用的,大多数人应该还是Eclipse结合ADT来开发.那么大多数时候我们可能希望点 ...
- api商品分享源码_SSM框架高并发和商品秒杀项目高并发秒杀API源码免费分享
前言: 一个整合SSM框架的高并发和商品秒杀项目,学习目前较流行的Java框架组合实现高并发秒杀API 源码获取:关注头条号转发文章之后私信[秒杀]查看源码获取方式! 项目的来源 项目的来源于国内IT ...
- android从入门到精通-项目实战(心得及源码)
个人心得 这个周的时间,我用了三天的时间跟着书籍上面的内容实现了,家庭理财通这个小的app,算是用来练手的开始.首先开始实现的时候,我是先从项目的架构开始,首先你的先理解者这个APP具体是干什么的,有 ...
- SpringBoot+SpringCloud+Mybatis+Vue 电商项目实战,附视频+源码+文档,包含所有主流技术栈。...
大家好,我是树哥. 今天给大家分享一个电商项目--- 畅购商城.项目采用前后端分离的技术架构. 采用SpringBoot+SpringCloud+Mybatis+Vue为主要技术栈,包括了大型商城的主 ...
- SpringBoot+SpringCloud+Mybatis+Vue电商项目实战,附视频+源码+文档,包含所有主流技术栈...
今天给大家分享一个电商项目--- 畅购商城.项目采用前后端分离的技术架构. 采用SpringBoot+SpringCloud+Mybatis+Vue为主要技术栈,包括了大型商城的主要功能.难点功能以及 ...
- Python项目实战——外汇牌价(附源码)
前言 几乎每个人都在使用银行卡,今天我们就来爬取某行外汇牌价,获取我们想要的数据. 环境使用 python 3.9 pycharm 模块使用 requests 模块介绍 requests reques ...
- 【Python】从0到1:一文教会你如何用Python制作好看又实用的二维码!【文末彩蛋!】(可直接copy + 运行哦~!)
Hi~ o(* ̄▽ ̄*)ブ!你好吖~! 经过 "作业雨 " 的 "洗礼",我终于又回来啦!!! 今天又有什么 "惊喜" 捏?! 往下看叭~! ...
- android 关联源码
当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都是已经写好的方法和控件,可是我们只是在搬来使用,不知道它的原理,它是如何被实现的.android系统是开源的,所以谷歌官方 ...
最新文章
- 基于jquery多种切换效果的焦点图(兼容ie6)
- C++ leetcode 5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
- CSS实例:图片导航块
- 读jquery 权威指南[7]-性能优化与最佳实践
- 算法学习笔记(5)-------位运算的tips
- 纯VB代码取得硬盘的物理序列号
- 常见计算机基础笔试题总结quickstart
- R语言初级教程: NA、Inf、NaN、NULL 特殊值
- 17.go 面向对象 interface
- wdr7300百兆版_TPLINK WDR7660千兆版无线路由器拆机
- office2016鼠标右键没有新建word等
- 51中断编程c语言,有关51单片机中断的形式和C语言编程格式[精选5篇]
- 清除tomcat缓存HTML,清除Tomcat缓存
- idea错误:否则 JavaFX 应用程序类必须扩展javafx.application.Application
- JuliaFEM中的数据格式——fields.jl
- python数据分析中data_dict={h:v for h,v in zip(header,zip(header,zip(*value)}的含义
- 加油站都需要什么手续_企业自备加油站需要办理哪些手续
- ei会议论文录用但不参加会议_同一个EI会议录用的文章一定全部都进EI吗?
- VS2015 密钥 专业版和企业版
- 2022年可可香精市场前景分析及研究报告
热门文章
- 金融大数据模型分享-股市评论数据情感分析
- 解决npm install 失败问题
- 如何导入本地镜像到阿里云ECS服务器
- BeautifulSoup爬取贝壳网成都二手房源信息(附:完整源代码)
- 路由器限制计算机访问,路由器如何禁止设备访问指定网站?
- NodeJs 学习资料
- DocuWare 文件管理与工作流程自动化案例研究——DocuWare 工作流程功能使在家工作的员工能够保持沟通和高效工作,支持混合环境
- amdgpu kfd TTM create GTT
- oracle数据库 uga,Oracle内存结构
- python例子高考志愿填报系统入口_江苏2018年高考模拟志愿填报入口(官方)