近期kaki的项目出现一个生产问题,发现有个值不生效,是0,从上游报文看实际是有具体的值的,报文大概这样:
第一种 {"score":200,"name":"张三"}
第二种 {"score":"200","name":"张三"}
经过测试排查发现,落表后第二种报文的score有值,第一张是0。梳理程序发现今年6月份改过一段代码
这里写伪代码
改之前:
String str = 第一种 或者 第二种
JSONObject job = JSONObject.parseObject(str);
String scoreStr = job.get("score").toString()
由于当时的生产报文会出现“第三种 {"name":"张三"})”的情况,生产的日志经常报警说“xxx为null,控制指针异常”,故我们做了一次优化
改造后:
String str = 第一种 或者 第二种
JSONObject job = JSONObject.parseObject(str);
String scoreStr = (String) job.get("score");
此种方法的好处是,当get一个不存在的值时,不会出现null.toString()的情况,但改了之后发现“第一种”报文无法正常获取了会出现
String scoreStr = (String) 200; -- cannot cast int to String 的问题,导致异常分支直接将值设置成0
但基本数据类型也是不支持:
String scoreStr = 200.toString() -- 不能够使用引用字符串的方法
经过分析原来的代码发现,JSONObject.parseObject(str) 这步会将基础数据类型转出Integer类型,Integer是只支持200.toString()的,所以6月之前的代码没问题,6月后的2个月数据量小没有发现问题,9月为季度尾数据量大才发现问题。
总上所述,大家还是要具体评估使用toString(),还是强转,不要盲目认为强转一定比toString()安全。