别让数据类型问题害了你的系统

一、数据类型,熟悉吗?

数据是代码中重要组成部分,而数据类型的选择和使用也影响着代码逻辑的正确性和服务的性能。

在接口测试过程中,你仔细端详过数据类型吗?

我们会发现:数据类型,很容易被忽略,很容易出问题。

 

二、数据类型概述

Java决定了每种简单类型的大小,这些大小并不随着机器结构的变化而变化。数据类型其大小的不可更改的特点正是Java程序具有很强移植能力的原因之一。

下表列出了Java中定义的简单类型、占用二进制位数及对应的封装器类:

简单类型

boolean

byte

char

short

Int

long

float

double

二进制位数

1

8

16

16

32

64

32

64

封装器类

Boolean

Byte

Character

Short

Integer

Long

Float

Double

数据类型的使用过程中,数据类型转换的场景出现频率较高,也是容易出问题的地方。

这里列出简单类型数据间的转换,有两种方式:自动转换强制转换,通常发生在表达式中或方法的参数传递时。

  • 自动转换:数据类型由“小”到“大”分别为 (byte,short,char)--int--long--float—double,这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。具体地讲,当一个较“小”数据

    和一个较“大”的数据一起运算时,系统会自动将“小”数据转换成“大”数据,再进行运算。

  • 强制转换:将“大”数据转换为“小”数据时,可以使用强制类型转换,用圆括号括起来目标类型,置于变量前。

 

三、典型的案例

在代码中,不同的业务场景往往需要设置不同的数据类型,随着业务场景的复杂化,可能最初设计的数据类型已经满足不了业务需求,那么在发展过程中,要及时反思和评估数据类型是否合适恰当以及使用方法是否合理。

下面,我们来看一下各类问题的典型案例:

1、数据类型范围问题

1)问题:发送mq消息,业务方根据需要可以订阅mq消息消费,prod环境验证时发现B端会员发送mq时,获得结果A是负数;

原因:由于代码中,较长的数据先转换成int类型后进行处理,超出int范围,出现了负数情况

2)问题:数据超出范围,转换错误;

原因:字段B使用Integer类型 金额字段是以分为单位 超过Integer最大值 需要修改为Long 否则会出现负数

 

2、精度问题

1)问题: 字段C由0.0037变更为0.004,导致变为0.004;

原因:修改精度由(10,4)变成(17,3), 因此0.0037 的入库保存时为0.004

 

3、数据类型错误&选取不当问题

1)问题:操作缓存,数据类型选取错误;

原因:直接操作了缓存,缓存值时未选择值类型,值类型按默认选项被设置成了String(应该是Long ),类型转换失败导致抛出异常。

2)问题:没有兼容全部枚举字段,系统报错;

原因:字段为string类型,可能值为“xx.xx”、“0.00”、“null”、“一段话“,但调用接口使用为int型,导致“一段话“时不兼容;

 

4、数据类型封装器类使用问题

问题:方法使用错误

原因:long是基本数据类型,Long是long的的包装类,long的大小比较可以用:“>”、“==”、“<”;对于Long类型的数据,实际是一个对象,所以对象不可以直接通过“>”,“==”,“<”的比较,这样比较的话,比较两个对象的地址相等才相等;如果要比较两个对象的是否相等的话,可以用Long对象的.equals()方法;

 

四、开发如何预防

1)方案设计:针对涉及到数据类型的技术方案设计时,建议考虑如下问题:

  • 数据类型范围是否满足需求,对业务发展进行评估,进而综合业务发展和系统性能,从长远的眼光来选取合适的数据类型;

  • 数据类型精度会不会造成数据有偏差,是否会因为极限情况有问题隐患;

  • 不能忽略每个小细节的异常处理机制;

  • 上下游接口调用时,务必考虑数据类型兼容问题,业务对接时候,数据存在的情况未做完备分析,保证对所有结果做处理做了完备性处理;

2)逻辑改造:遇到老逻辑改造时候,务必考虑数据类型,仔细校对参数的类型,及时评估数据类型是否满足当前业务发展;

  • 新老逻辑的参数对比,不仅关注输入输出参数,还要关注内部实现逻辑;

  • 设计合理的灰度逻辑,灰度中及时监控,及时发现问题;

  • 数据类型的使用方法、选择方式形成规范,避免技术性错误;

3)代码review:严格review对象的数据类型、接口文档参数类型、数据库字段的类型;

4)单测建设:增加单测发现问题能力,涉及到数据类型转化的单测数据选择覆盖全面;

5)线上操作:遵守线上配置操作规范,禁止未通知其他同事PR就直接操作线上配置,操作注意代码数据类型,很容易被忽略的小细节,很容易出问题;

五、测试如何发现

1)技术方案评审时,积极思考数据类型选择是否合适,是否符合业务场景需求;

2)测试过程中,注意对测试数据的选择,测试数据要构造典型数据、极限场景、异常场景、同时避免数据巧合,涉及到数据转化功能测试不易覆盖的,建议自己编写测试代码来验证数据类型转化是否正确;

3)test环境和数据库数据和线上规则尽量保持一致,对数据库操作和线上环境也保持一致,例如分表、数据范围、数据表改动等,便于提早发现问题;

4)st环境操作和线上操作保持一致,包括上线顺序,对数据库的操作,发挥st环境的作用;线上设置合理的灰度逻辑,及时跟踪线上验证;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值