最近做一个项目,上线之后直接挂了,我简直不能忍受这件事情!!!因为在上线之前我做了还算细致的单元测试,追根溯源,终于发现问题出在下面这个帮助类方法,先贴代码,大家猜猜它是做什么的:
public static String formatStrChina(String s) {
if(s==null || "".equals(s) ){
return "0.00元";
}
try {
Double d = Double.valueOf("0.01");
if(d == 0){
return "0.00元";
}
} catch (Exception e) {
e.printStackTrace();
return "0.00元";
}
BigDecimal d1 = new BigDecimal(s);
BigDecimal d2 = d1.divide(new BigDecimal(10000));
// 将传进数字反转
String str = String.valueOf(d2);
String reverseStr = new StringBuilder(
str.substring(0, str.indexOf("."))).reverse().toString();
String strTemp = "";
for (int i = 0; i < reverseStr.length(); i++) {
if (i * 3 + 3 > reverseStr.length()) {
strTemp += reverseStr.substring(i * 3, reverseStr.length());
break;
}
strTemp += reverseStr.substring(i * 3, i * 3 + 3) + ",";
}
// 将 【789,456,】 中最后一个【,】去除
if (strTemp.endsWith(",")) {
strTemp = strTemp.substring(0, strTemp.length() - 1);
}
// 将数字重新反转
String resultStr = new StringBuilder(strTemp).reverse().toString()
+ str.substring(str.indexOf("."), str.length());
return resultStr + "万";
}
猜不出来了吧,很好,我也是这么想的,方法注释是这样的:
// 把数值型字符串,四舍五入保留两位以万元为单位
天地良心啊,这代码怎么能达到这个目的,先不说代码有多烂,这个................根本就不能用!!!简直全是bug在里面,
看看下面的部分:
try {
int sd=Integer.parseInt(s);
if(sd==0){
return "0.00元";
}
} catch (Exception e) {
return "0.00元";
}
看到了吗?要是参数不带小数点直接就变成“0.00元”了,而且没有给异常栈信息打出来,根本就不知道这个异常过程的存在,好了,我们接着看下一个:
String resultStr = new StringBuilder(strTemp).reverse().toString()
+ str.substring(str.indexOf("."), str.length());
如果str里没有小数点 oh,my god!直接就崩掉了,天地良心,这个方法用在一个客户金额统计的地方,居然已经到线上了而且还很久了,我真的也是有点晕............
不吐槽了,填坑去