返回介绍

1.6 类型安全转换函数

发布于 2024-08-17 23:46:12 字数 1781 浏览 0 评论 0 收藏 0

在每天统计线上崩溃的时候,我们发现因为类型转换不正确导致的崩溃占了很大的比例。于是我们去检查程序中所有的类型转换,发现主要集中在两个地方: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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文