1.6 类型安全转换函数
在每天统计线上崩溃的时候,我们发现因为类型转换不正确导致的崩溃占了很大的比例。于是我们去检查程序中所有的类型转换,发现主要集中在两个地方:Object类型的对象、substring函数。下面分别说明。
1)对于一个Object类型的对象,我们对其直接使用字符串操作函数toString,当其为null时就会崩溃。
比如,我们经常会写出下面这样的程序:
int result = Integer.valueOf(obj.toString());
一旦obj这个对象为空,那么上面这行代码会直接崩溃。
这里的obj,一般是从JSON数据中取出来的,对于MobileAPI返回的JSON数据,我们无法保证其永远不为空。
比较好的做法是,我们需要编写一个类型安全转换函数convertToInt,实现如下,其核心思想就是,如果转换失败,就返回默认值:
public final static int convertToInt(Object value, int defaultValue) { if (value == null || "".equals(value.toString().trim())) { return defaultValue; } try { return Integer.valueOf(value.toString()); } catch (Exception e) { try { return Double.valueOf(value.toString()).intValue(); } catch (Exception e1) { return defaultValue; } } }
我们将这个方法放到Utils类下面,每当要把一个Object对象转换成整型时,都使用该方法,就不会崩溃了:
int result = Utils.convertToInt(obj, 0);
以上只是其中一种类型安全转换函数,相应的,我们在Utils类中还要提供诸如Object到long、double、String等类型的类型安全转换函数,以满足我们的不时之需。
2)如果长度不够,那么执行substring函数时,就会崩溃。
Java的substring函数有2个参数:start和end。
对于第一个参数start,我们的程序大多是设为0,所以一般不会有问题。但是要设置为大于0的值时,就要仔细思量了,比如:
String cityName = "T"; String firstLetter = cityName.substring(1, 2);
这样的代码必然崩溃,所以每次在使用substring函数的时候,都要判断start和end两个参数是否越界了。应该这样写:
String cityName = "T"; String firstLetter = ""; if (cityName.length() > 1) { firstLetter = cityName.substring(1, 2); }
以上两类问题的根源,都来自MobileAPI返回的数据,由此而引出另一个很严肃的问题,对于从MobileAPI返回的数据,可信度到底有多高呢?
首先,不能让App直接崩溃,应该在解析JSON数据的外面包一层try…catch…语句,将截获到的异常在catch中进行处理,比如说,发送错误日志给服务器。
其次,对数据要分级别对待,例如:
1)对于那些不需要加工就能直接展示的数据,我们是不担心的,因为即使为空,页面上也就是不显示而已,不会引起逻辑的问题。
2)对于那些很重要的数据,比如涉及支付的金额不能为空的逻辑,这时候就应该弹出提示框提示用户当前服务不可用,并停止接下来的操作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论